在pandas df.plot中设置颜色图限制

3 投票
2 回答
2412 浏览
提问于 2025-04-18 07:06

我有一个数据框,它同时绘制了线条和一个表格。我的颜色映射设置为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')

enter image description here

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')

enter image description here

撰写回答