我可能做错了,但我很难实现以下目标:
# 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
答案 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')
这仅显示线条而非条形图
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')
答案 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')