在pandas df.plot中设置颜色图限制
我有一个数据框,它同时绘制了线条和一个表格。我的颜色映射设置为Purples_r
,这个颜色从紫色渐变到白色。我想限制这个颜色映射,让最浅的颜色不是白色,而是更浅的紫色,该怎么做呢?
fig, ax = plt.subplots(1, 1)
ax.get_xaxis().set_visible(False)
df.plot(marker='o', colormap='Purples_r', table=np.round(df.T, 2), ax=ax)
我试着按照设置matplotlib颜色条范围的方法去做,但没有成功。
值得一提的是,我使用的是pandas 0.14版本。
2 个回答
0
我之前也遇到过同样的问题,直到我发现matplotlib的颜色映射有两个属性,分别是 _i_under
和 _i_above
,可以手动设置。在我的情况下,我使用的是 matplotlib.cm.Blues_r
,但我想把0(恰好是我数据中的最低值)设置成其他颜色,而不是白色。
cmap = matplotlib.cm.Blues_r
cmap._i_under = 0
cmap.set_under('green')
上面的代码对我有效。然后你只需要把这个颜色映射传给 pandas.plot()
就可以了。
我对matplotlib内部的对象了解不多,但 _i_under
和 _i_above
似乎是从matplotlib的颜色类继承来的(具体可以查看 这里)。
因为使用pandas的绘图方法有时候比直接用matplotlib或pyplot要简洁很多,所以希望这对你有帮助!
3
这可以通过获取颜色映射的 segmentdata
来实现,然后制作一个自定义的颜色映射,限制在一个更窄的颜色范围内:
In [30]:
from matplotlib import colors
from matplotlib import cm
D={item: cm.Purples_r._segmentdata[item][3:-3] for item in ['blue', 'green', 'red']}
#only use the middle range of color
for item in ['blue', 'green', 'red']:
seg=np.linspace(0,1,len(D[item]))
for i in range(len(D[item])):
D[item][i]=(seg[i],D[item][i][1],D[item][i][2])
In [31]:
New_cm = colors.LinearSegmentedColormap('New_cm', D)
df=pd.DataFrame(np.random.random((5,5)))
In [32]:
fig, ax = plt.subplots(1, 1)
ax.get_xaxis().set_visible(False)
df.plot(marker='o', colormap=cm.Purples_r, ax=ax)
plt.title('Original Purples_r')
plt.savefig('1.png')
In [33]:
fig, ax = plt.subplots(1, 1)
ax.get_xaxis().set_visible(False)
df.plot(marker='o', colormap=New_cm, ax=ax)
plt.title('Limited Purples_r')
plt.savefig('2.png')