【问题标题】:Bar plot with heatmap color palette带有热图调色板的条形图
【发布时间】:2017-12-05 04:17:04
【问题描述】:

我使用matplotlib.pyplotseaborn 库创建了一个简单的条形图。是否可以更改条的配色方案,使对应于较高计数的条具有较深的红色,而低计数的条具有浅红色?因此,某种适用于条形图的热图。我该怎么做?目前,我的计数图中有随机颜色。

df =
    DeviceId   Speed
    1          30
    1          35 
    1          31
    2          20
    2          25
    3          80

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

%matplotlib inline

result = df.groupby(["DeviceId"])['Speed'].aggregate(np.median).reset_index()

plt.figure(figsize=(12,8))
sns.barplot(x="DeviceId", y="Speed", data=result)
plt.ylabel('Median speed', fontsize=12)
plt.xlabel('Device ID', fontsize=12)
plt.xticks(rotation='vertical')
plt.show()

更新:

我试过这个:

sns.barplot(x="DeviceId", y="Speed", data=result, palette=sns.cubehelix_palette(8))

但较深的颜色不对应较高的计数。看起来颜色是使用预定义的调色板随机分配给条形的。

【问题讨论】:

  • 这一行命令有错字:result = df.groupby(["DeviceId"])'Speed'].aggregate(np.median).reset_index() ("]")
  • @edouard:谢谢,已修复。

标签: python pandas matplotlib seaborn


【解决方案1】:

对于 Python 3.x,标准步骤必须进行调整:

u = u"""DeviceId   Speed
    1          01
    1          09
    1          31
    2          20
    2          25
    3          80"""

import io
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
#%matplotlib inline
sns.set(font_scale=1.5)

df     = pd.read_csv(io.StringIO(u), delim_whitespace=True)
result = df.groupby(["DeviceId"])['Speed'].aggregate(np.median).reset_index()

norm   = plt.Normalize(0, result["Speed"].values.max())
colors = plt.cm.RdYlGn(   result["Speed"].apply(norm ))

fig    = plt.figure(figsize=(12,8))
ax     = sns.barplot(x="DeviceId", y="Speed", data=result, palette=colors,  )

_ = plt.ylabel('Median speed', fontsize=12)
_ = plt.xlabel('Device ID'   , fontsize=12)
_ = plt.xticks(rotation= 90 )
plt.show()

【讨论】:

    【解决方案2】:

    您可以通过定义具有最小和最大数据值的规范化实例来根据颜色图获取颜色,并使用此规范化和选择的颜色图将数据映射到颜色。在这里,使用反向铜映射可能是有意义的(见colormap reference

    norm = plt.Normalize(result["Speed"].values.min(), result["Speed"].values.max())
    colors = plt.cm.copper_r(norm(result["Speed"])) 
    

    然后您可以在条形图中使用这些颜色

    sns.barplot(x="DeviceId", y="Speed", data=result, palette=colors)
    

    重现上述内容的完整代码:

    u = u"""DeviceId   Speed
        1          30
        1          35 
        1          31
        2          20
        2          25
        3          80"""
    
    import io
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    import seaborn as sns
    
    #%matplotlib inline
    
    df = pd.read_csv(io.StringIO(u), delim_whitespace=True)
    result = df.groupby(["DeviceId"])['Speed'].aggregate(np.median).reset_index()
    
    norm = plt.Normalize(result["Speed"].values.min(), result["Speed"].values.max())
    colors = plt.cm.copper_r(norm(result["Speed"]))
    
    plt.figure(figsize=(12,8))
    sns.barplot(x="DeviceId", y="Speed", data=result, palette=colors)
    plt.ylabel('Median speed', fontsize=12)
    plt.xlabel('Device ID', fontsize=12)
    plt.xticks(rotation='vertical')
    plt.show()
    

    0 开始标准化也可能对任何顺序颜色图有很好的效果,

    norm = plt.Normalize(0, result["Speed"].values.max())
    colors = plt.cm.Purples(norm(result["Speed"]))
    

    【讨论】:

    • 太棒了。如何制作红色地图?
    • 也许您从提供的链接中查看颜色图并尝试一些。如果结果不是您喜欢的,请更具体地询问。
    猜你喜欢
    • 2020-12-16
    • 2012-08-19
    • 2012-06-14
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 2018-12-14
    • 1970-01-01
    相关资源
    最近更新 更多