Python Pandas DataFrame - 无法在同一轴上绘制条形和线条

时间:2015-08-04 15:50:31

标签: python pandas matplotlib

我可能做错了,但我很难实现以下目标:

# plot bars and lines in the same figure, sharing both x and y axes.
df = some DataFrame with multiple columns
_, ax = plt.subplots()
df[col1].plot(kind='bar', ax=ax)
df[col2].plot(ax=ax, marker='o', ls='-')
ax.legend(loc='best')

我希望看到一张图表,两者一些条形和一条线。但是,我最终得到的只是df[col2]的行,来自df[col1]的栏不在图表上。无论df[col2]之前是什么似乎都被覆盖了。

我解决了这个问题:

df[col1].plot(kind='bar', ax=ax, label=bar_labels)
ax.plot(df[col2], marker='o', ls='-', label=line_labels)
ax.legend(loc='best')

然而,这并不完美,因为我必须使用label标签,否则传说将不会包含df[col2]的项目......

那里的任何人都有一个更优雅的解决方案,让条形和线条出现?

**编辑** 感谢@DizietAsahi - 发现这是DatetimeIndex作为x值的问题。在熊猫提起以下文件:

https://github.com/pydata/pandas/issues/10761#issuecomment-128671523

3 个答案:

答案 0 :(得分:5)

我想知道你的问题是否与你的情节的hold状态有关......

这有效:

df = pd.DataFrame(np.random.random_sample((10,2)), columns=['col1', 'col2'])
fig, ax = plt.subplots()
plt.hold(True)
df['col1'].plot(kind='bar', ax=ax)
df['col2'].plot(ax=ax, marker='o', ls='-')
ax.legend(loc='best')

enter image description here

这仅显示线条而非条形图

df = pd.DataFrame(np.random.random_sample((10,2)), columns=['col1', 'col2'])
fig, ax = plt.subplots()
plt.hold(False)
df['col1'].plot(kind='bar', ax=ax)
df['col2'].plot(ax=ax, marker='o', ls='-')
ax.legend(loc='best')

enter image description here

答案 1 :(得分:5)

感谢@DizietAsahi - 发现这是DatetimeIndex作为x值的问题。整数值与上面的@DizietAsahi代码一起使用。

在熊猫提交以下内容:

https://github.com/pydata/pandas/issues/10761#issuecomment-128671523

答案 2 :(得分:1)

使用DatetimeIndex作为我的x值我有同样的问题。使用Jupyter Notebook Version 4.2.0和Python 2.7.11,我无法在github处获得黑客工作。我按月将两列分组绘制为条形图,然后将原始值覆盖为折线图。

我的解决方案是使用matplotlib绘制条形图和线条,这是我能让它工作的唯一方法。

import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
matplotlib.style.use('ggplot')
%matplotlib inline

df = pd.read_excel('data.xlsx', index_col='Date')
fig, ax = plt.subplots(figsize=(15,10)) 
ax.hold(True)
g = df.groupby(pd.TimeGrouper("M"))
width=10

ax.bar(g.sum().index, g['Money Out'].sum(),width=width, color='r',label='Money Out')
ax.bar(g.sum().index, g['Money in'].sum(),width=-width,color='g', label='Money In')
ax.plot(df[['Balance']], color='black', lw=1, ls='-',label='Balance')  

ax.legend(loc='best')

image