我无法在同一个地块上显示条形图和折线图。示例代码:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
Df = pd.DataFrame(data=np.random.randn(10,4), index=pd.DatetimeIndex(start='2005', freq='M', periods=10), columns=['A','B','C','D'])
fig = plt.figure()
ax = fig.add_subplot(111)
Df[['A','B']].plot(kind='bar', ax=ax)
Df[['C','D']].plot(ax=ax, color=['r', 'c'])
答案 0 :(得分:12)
你也可以试试这个:
fig = plt.figure()
ax = DF['A','B'].plot(kind="bar");plt.xticks(rotation=0)
ax2 = ax.twinx()
ax2.plot(ax.get_xticks(),DF['C','D'],marker='o')
答案 1 :(得分:2)
我也想知道,但是所有现有的答案都不是在相同图上显示条形图和折线图,而是在不同的轴上显示。
所以我自己找了答案并找到了一个有效的例子 - Plot Pandas DataFrame as Bar and Line on the same one chart。我可以确认它works。
令我感到困惑的是,几乎相同的代码works there,但does not work here。即,我复制了OP的代码并且可以verify that it is not working as expected。
我唯一能想到的是将索引列添加到Df[['A','B']]
和Df[['C','D']]
,但我不知道索引列没有名称我要加。
今天,我意识到即使我可以使它工作,真正的问题是Df[['A','B']]
给出了一个分组(聚集)条形图,但分组(聚集)线图表不是支持的。
答案 2 :(得分:0)
你可以在同一个数字上做同样的事情:
In [4]: Df = pd.DataFrame(data=np.random.randn(10,4), index=pd.DatetimeIndex(start='2005', freq='M', periods=10), columns=['A','B','C','D'])
In [5]: fig, ax = plt.subplots(2, 1) # you can pass sharex=True, sharey=True if you want to share axes.
In [6]: Df[['A','B']].plot(kind='bar', ax=ax[0])
Out[6]: <matplotlib.axes.AxesSubplot at 0x10cf011d0>
In [7]: Df[['C','D']].plot(color=['r', 'c'], ax=ax[1])
Out[7]: <matplotlib.axes.AxesSubplot at 0x10a656ed0>
答案 3 :(得分:0)
问题在于,pandas 条形图函数将日期视为分类变量,其中每个日期都被视为一个唯一类别,因此 x 轴单位设置为从 0 开始的整数(就像默认的 DataFrame 索引,当没有分配)。
pandas 线图使用对应于 DatetimeIndex 的 x 轴单位,其中 0 位于 1970 年 1 月,整数表示从那时起的周期数(本例中为月)。那么让我们来看看在这种特殊情况下会发生什么:
import numpy as np # v 1.19.2
import pandas as pd # v 1.1.3
# Create random data
rng = np.random.default_rng(seed=1) # random number generator
df = pd.DataFrame(data=rng.normal(size=(10,4)),
index=pd.date_range(start='2005', freq='M', periods=10),
columns=['A','B','C','D'])
# Create a pandas bar chart overlaid with a pandas line plot using the same
# Axes: note that seeing as I do not set any variable for x, df.index is used
# by default, which is usually what we want when dealing with a dataset
# containing a time series
ax = df.plot.bar(y=['A','B'], figsize=(9,5))
df.plot(y=['C','D'], color=['tab:green', 'tab:red'], ax=ax);
酒吧无处可见。如果您检查正在使用的 x 个刻度,您会看到 1 月份的单个主要刻度是 420
,然后是其他月份的这些小刻度:
ax.get_xticks(minor=True)
# [421, 422, 423, 424, 425, 426, 427, 428, 429]
这是因为自 1970 年以来有 35 年 * 12 个月,编号从 0 开始,因此 2005 年 1 月落在 420。这解释了为什么我们看不到条形。如果您将 x 轴限制更改为从零开始,您会得到以下结果:
ax = df.plot.bar(y=['A','B'], figsize=(9,5))
df.plot(y=['C','D'], color=['tab:green', 'tab:red'], ax=ax)
ax.set_xlim(0);
从 1970 年 1 月开始,条形向左压扁。可以通过在线条图函数中设置 use_index=False
使线条也从 0 开始来解决此问题:
ax = df.plot.bar(y=['A','B'], figsize=(9,5))
df.plot(y=['C','D'], color=['tab:green', 'tab:red'], ax=ax, use_index=False)
ax.set_xticklabels(df.index.strftime('%b'), rotation=0, ha='center');
# # Optional: move legend to new position
# import matplotlib.pyplot as plt # v 3.3.2
# ax.legend().remove()
# plt.gcf().legend(loc=(0.08, 0.14));
如果您想要更高级的刻度标签格式,您可以查看与此示例兼容的 this question 答案。如果您需要 matplotlib.dates 模块中的刻度定位器和格式化程序提供的更灵活/自动化的刻度标签格式,最简单的方法是使用 matplotlib 创建绘图,例如 this answer。