2017-07-01 58 views
1

我使用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() 

UPDATE:

我尝试这样做:

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

但较深的颜色不对应于较高的计数数字。它看起来像使用预定义的调色板随机分配颜色。

+0

有该线路上的命令一个错字:结果= df.groupby([“DEVICEID”])“速度” ] .aggregate(np.median).reset_index()(“]”) – tagoma

+0

@edouard:谢谢,修正。 – Dinosaurius

回答

2

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

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

然后,您可以使用这些颜色在barplot

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

enter image description here

完整代码复制以上:

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"])) 

enter image description here

+0

太好了。我怎样才能做一个红色的地图? – Dinosaurius

+1

也许你从所提供的链接中查看颜色映射,并尝试一些。如果结果不符合您的要求,请详细询问一下。 – ImportanceOfBeingErnest