为什么Seaborn颜色调色板不能用于Pandas条形图?

8

一个在线的Jupyter笔记本演示了代码并显示颜色差异,网址为:https://anaconda.org/walter/pandas_seaborn_color/notebook

使用Pandas dataframe方法制作条形图时,颜色会出现错误。Seaborn可以改善matplotlib的颜色调色板。所有来自matplotlib的绘图都会自动使用新的Seaborn调色板。然而,来自Pandas数据框的条形图会恢复到非Seaborn颜色。这种行为不一致,因为来自Pandas数据框的线图确实使用Seaborn颜色。即使我在所有绘图中都使用Pandas,这也会使我的绘图看起来具有不同的风格。

如何在使用Pandas方法进行绘图时获得一致的Seaborn颜色调色板?

我正在使用Python 2.7.11,在一个只包含此代码所需的必要软件包(pandas、matplotlib和seaborn)的conda环境中运行此代码。

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

df = pd.DataFrame({'y':[5,7,3,8]})

# matplotlib figure correctly uses Seaborn color palette
plt.figure()
plt.bar(df.index, df['y'])
plt.show()

# pandas bar plot reverts to default matplotlib color palette
df.plot(kind='bar')
plt.show()

# pandas line plots correctly use seaborn color palette 
df.plot()
plt.show()

  1. 你的具体问题是什么 - 你想知道解决方案(和可能的解决方法),还是想知道这种行为的原因?
  2. 这些信息可能与你的问题有关:pyplot.scatter也不使用seaborn颜色(默认情况下?)。
- MB-F
感谢kazemakase。我已经编辑了问题,以澄清我想知道如何在使用Pandas方法绘图的同时获得一致的Seaborn颜色调色板。(当然,了解原因可能对上述有所帮助。) - Walter
2个回答

8
感谢@mwaskom指出了。我一直在寻找它,但不知何故错过了,因此出现了原始的混乱。
作为解决方法,您可以手动设置颜色。请注意,如果您正在绘制一个或多个列,则color关键字参数的行为会有所不同。
df = pd.DataFrame({'x': [3, 6, 1, 2], 'y':[5, 7, 3, 8]})

df['y'].plot(kind='bar', color=sns.color_palette(n_colors=1))

One column plot

df.plot(kind='bar', color=sns.color_palette())

Two columns plot

我的原始答案:

prop_cycle = plt.rcParams['axes.prop_cycle']
df['y'].plot(kind='bar', color=next(iter(prop_cycle))['color'])
df.plot(kind='bar', color=[x['color'] for x in prop_cycle])

1
你可以直接使用sns.color_palette()来获取当前颜色,不必使用列表推导式。 - mwaskom

2

这是pandas中专门针对柱状图(和箱线图)存在的一个bug,已经在pandas主分支中解决了(请查看问题报告PR)。
这个修复会在即将发布的pandas 0.18.0版本中包含。


Joris,非常感谢你的帮助,问题链接也很有用。我希望我能选择两个答案,但我选择了Goyo的答案,因为它立即有用,并且似乎在这个主题方面具有更长远的潜力。谢谢! - Walter
我现在也确认了这个答案。我已经安装了Pandas开发版本0.18.0rc1+62.g41b1d25,这解决了问题。 - Walter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接