Python 带热图调色板的条形图
我使用Python 带热图调色板的条形图,python,pandas,matplotlib,seaborn,Python,Pandas,Matplotlib,Seaborn,我使用matplotlib.pyplot和seaborn库创建了一个简单的条形图。是否有可能以这样的方式更改条形图的颜色方案,即对应于较高计数的条形图具有较深的红色,而对应于较低计数的条形图具有浅红色?所以,某种热图应用于条形图。我怎么做?目前,我的计数图中有随机颜色 df = DeviceId Speed 1 30 1 35 1 31 2 20 2 2
matplotlib.pyplot
和seaborn
库创建了一个简单的条形图。是否有可能以这样的方式更改条形图的颜色方案,即对应于较高计数的条形图具有较深的红色,而对应于较低计数的条形图具有浅红色?所以,某种热图应用于条形图。我怎么做?目前,我的计数图中有随机颜色
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))
但较暗的颜色并不对应较高的计数。看起来颜色是使用预定义的调色板随机分配给条形图的。您可以通过定义具有最小和最大数据值的标准化实例,根据颜色映射获得颜色,并使用此标准化和所选的颜色映射将数据映射到颜色。在这里,使用反向铜地图可能有意义(请参阅) 然后可以在条形图中使用这些颜色
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
on进行规格化也可能对任何顺序颜色贴图都有很好的效果
norm = plt.Normalize(0, result["Speed"].values.max())
colors = plt.cm.Purples(norm(result["Speed"]))
对于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()
这行命令有一个输入错误:result=df.groupby([“DeviceId”])'Speed'].aggregate(np.median)。reset_index()(“])@edouard:谢谢,修复了。太好了。我如何制作红色地图?也许你可以从提供的链接中查看颜色地图并尝试一些。如果结果不是你喜欢的,问得更具体一点。
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()