如何使用定义的颜色图向熊猫图添加不同的颜色线

时间:2019-01-24 10:06:11

标签: python pandas matplotlib

我想在一张图中绘制4个图形,其中三条线应使用特定的色图,而另一条线应使用该色图内的颜色。这是示例代码

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
import seaborn as sns
import matplotlib.ticker as ticker

plt.style.use('ggplot')
data = pd.DataFrame(data=[[1, 0.0, 10],[87, 32, 161],[821, 271, 804],[246, 922, 819],[107, 785, 1697]], columns=['A', 'B', 'C'])
data_cost = pd.DataFrame(index=[2001, 2002, 2003, 2004, 2005], data=[[4],[311],[671],[862], [593]], columns=['D'])
my_cmap = ListedColormap(sns.color_palette("GnBu_d", 3).as_hex())
ax = data.plot(colormap=my_cmap, alpha=0.8, rot=0, xticks=data.index,
               linewidth=6, ylim=(-0.5, 20), ax=ax)
ax = data.plot(colormap=my_cmap, rot=0, xticks=data.index, marker='s', ms=15, linewidth=6, ylim=(-0.5, 13), ax=ax)
ax = data_cost.plot(color='r', rot=0, xticks=data_cost.index,
                    linewidth=6, ylim=(1000, 5000), marker='s', ms=15, ax=ax)
ax.set_ylabel('I', fontsize=40)
ax.xaxis.set_tick_params(labelsize=40)
ax.set_xlabel('Y', fontsize=40)
ax.yaxis.set_tick_params(labelsize=40)
box = ax.get_position()
ax.set_position([box.x0, box.y0, box.width * 0.8, box.height])
ax.legend(loc='center left', bbox_to_anchor=(1, 0.5), fontsize=40, prop={'size':32})
ax.set_facecolor('none')
plt.show()

不幸的是,这似乎不起作用。如果我在情节中删除斧头,看起来会更好。但是我该如何实现呢?最后,我想得到以下图,其中仅读取一行:

enter image description here

D为红色曲线。

1 个答案:

答案 0 :(得分:1)

您的代码似乎有很多问题。请在我的编辑版本下方找到,这应该使绘图与您在问题中发布的内容非常接近。我猜最大的问题是plot命令中的ylim参数矛盾,而Dataframe“数据”中缺少索引。请注意,fontsize=40大大增加了文本的比例,这就是为什么我将它们注释掉了。如果仍然需要这样做,则应尝试从那里进行尝试。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
import seaborn as sns
import matplotlib.ticker as ticker

fig, ax = plt.subplots()

plt.style.use('ggplot')
data = pd.DataFrame(index=[2001, 2002, 2003, 2004, 2005], data=[[1, 0.0, 10],[87, 32, 161],[821, 271, 804],[246, 922, 819],[107, 785, 1697]], columns=['A', 'B', 'C'])
data_cost = pd.DataFrame(index=[2001, 2002, 2003, 2004, 2005], data=[[4],[311],[671],[862], [593]], columns=['D'])
my_cmap = ListedColormap(sns.color_palette("GnBu_d", 3).as_hex())
##ax = data.plot(colormap=my_cmap, alpha=0.8, rot=0, xticks=data.index,
##               linewidth=6,
##               #ylim=(-0.5, 20),
##               ax=ax)
ax = data.plot(colormap=my_cmap, rot=0, xticks=data.index,
               marker='s', ms=15, linewidth=6,
               #ylim=(-0.5, 13),
               ax=ax
               )
ax = data_cost.plot(color='r', rot=0, xticks=data_cost.index,
                    linewidth=6,
                    #ylim=(1000, 5000),
                    marker='s', ms=15, ax=ax)
ax.set_ylabel('I')#, fontsize=40)
ax.xaxis.set_tick_params()#labelsize=40)
ax.set_xlabel('Y')#, fontsize=40)
ax.yaxis.set_tick_params()#labelsize=40)
box = ax.get_position()
ax.set_position([box.x0, box.y0, box.width * 0.8, box.height])
ax.legend(
    loc='center left', bbox_to_anchor=(1, 0.5),
    #fontsize=40,
    prop={'size':32})
ax.set_facecolor('none')
#plt.show()
fig.savefig('example.png', bbox_inches='tight')

最终数字如下:

result of the above code