问题:
我有一个pandas数据帧df,其中6行表示不同的变量。
我希望绘制条形图中的前两列,并希望使用第三列score根据现有的颜色映射(例如matplotlib viridis颜色映射)对条形图进行着色。
此数据帧如下所示:
ID count score
0 4 1 3
1 5 4 4
2 5 8 5
3 3 7 2
4 1 5 5
5 1 3 4我的代码目前是什么样子的:
df.plot('ID', 'count', kind='bar', figsize=(15,5), ax=plt.subplot(122), colors=cm.viridis.colors)
plt.show()但所有条的颜色都是一种独特的紫色。
比方说,我希望按照score列中的值对viridis颜色映射进行采样。
有没有简单的方法可以做到这一点?
编辑2019-10-31
按照第一个答案中的建议使用seaborn会给我一个错误:
my_palette = sns.color_palette(plt.get_cmap('viridis'), 5)
sns.barplot(x="New ID", y="count", hue="Note", data=df, palette=my_palette)返回错误:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-48-1943cafa0d79> in <module>
----> 1 my_palette = sns.color_palette(plt.get_cmap('viridis'), 5)
/usr/local/lib/python3.6/dist-packages/seaborn/palettes.py in color_palette(palette, n_colors, desat)
238
239 # Always return as many colors as we asked for
--> 240 pal_cycle = cycle(palette)
241 palette = [next(pal_cycle) for _ in range(n_colors)]
242
TypeError: 'ListedColormap' object is not iterable编辑2019-11-05
使用建议的代码会导致结果图中出现带有x-tick的未对齐的条形图(我预计它会在x轴上的条形图下方居中),特别是当每个类别只有一个条形图时,如下图所示:

此外,我希望能够考虑df['count']列中的'NaN'值。目前,如果有一个'NaN'值,它会引发一个:
TypeError: unsupported operand type(s) for /: 'str' and 'int'
所以,我必须将这个值设置为等于0,即使它不是真正的零。
发布于 2019-10-31 19:26:07
最简单的方法是这样使用seaborn.barplot:
import seaborn as sns
ax = sns.barplot(x="ID", y="count", hue="score", data=df, palette=your_palette)您可以通过以下方式创建调色板:
your_palette = sns.color_palette('inferno', n_point)其中n_point是您的客户调色板中不同颜色的数量。

希望能有所帮助。
https://stackoverflow.com/questions/58642183
复制相似问题