【问题标题】:Set Seaborn bar color based on values not included in the plot根据图中未包含的值设置 Seaborn 条形颜色
【发布时间】:2019-05-06 06:54:08
【问题描述】:

我有一个 pandas 数据框 df,其中包含 x(分类)、yz(都是浮点数)列。

这是我的条形图。

sns.barplot(data=df, x=x, y=y)

如何根据z 列的值为条形设置调色板?我想设置一个 Matplotlib 风格的调色板,如 magmaRdYlBu。基本上,就像设置 hue 参数一样,但带有一个标量变量。

提前致谢!

【问题讨论】:

    标签: python matplotlib seaborn


    【解决方案1】:

    只需使用对应于 hue 变量的palette 参数:

    sns.barplot(data=df, x=x, y=y, hue=z, palette='magma')
    

    用随机数据演示:

    import numpy as np
    import pandas as pd
    import time
    from datetime import datetime
    import matplotlib.pyplot as plt
    import seaborn as sns
    
    data_tools = ['sas', 'stata', 'spss', 'python', 'r', 'julia']
    
    np.random.seed(11212018)
    rand_df = pd.DataFrame({'GROUP': np.random.choice(data_tools, 500),
                            'INT': np.random.randint(1, 10, 500),
                            'NUM': np.random.randn(500),
                           })
    
    fig, ax = plt.subplots(figsize=(15,5))
    sns.barplot(data=rand_df, x='GROUP', y='NUM', hue='INT', palette='magma', ax=ax, ci=None)
    
    plt.legend(bbox_to_anchor=(1,0.5), loc="center right",)
    plt.show()
    

    【讨论】:

      【解决方案2】:

      我不确定在 seaborn 中是否有办法做到这一点。但通常直接使用 matplotlib 也可以。

      import matplotlib.pyplot as plt
      import pandas as pd
      
      df = pd.DataFrame({"x" : list("ABCDEFGH"),
                         "y" : [3,4,5,2,1,6,3,4],
                         "z" : [4,5,7,1,4,5,3,4]})
      
      norm = plt.Normalize(df.z.min(), df.z.max())
      cmap = plt.get_cmap("magma")
      
      plt.bar(x="x", height="y", data=df, color=cmap(norm(df.z.values)))
      
      plt.show()
      

      如果您的“分类”列包含 pandas 类别,而不是简单的字符串,您首先需要将其转换为 df["x"] = df["x"].astype(str)

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-05
      • 1970-01-01
      • 2018-09-07
      • 2016-02-20
      相关资源
      最近更新 更多