我使用 <div class="col-lg-9 col-sm-12">
<div class="form-group" style="margin-top: 110px;">
<label>First Name</label>
<div><input type="text" name="first_name" value="XXX" placeholder="First Name" class="form-control"></div>
</div>
<div class="form-group">
<label>Last Name</label>
<div><input type="text" name="last_name" value="XXX" placeholder="Last Name" class="form-control"></div>
</div>
</div>
</div>
和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()
但较暗的颜色与较高的计数数字不对应。看起来使用预定义的调色板将颜色随机分配到条形图上。
答案 0 :(得分: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"]))
答案 1 :(得分:0)
对于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()