如何使用matplotlib绘制不同长度的熊猫系列?

时间:2019-04-21 18:11:48

标签: python pandas matplotlib

我有两个大熊猫系列,一个大熊猫全年滚动平均7天,另一个大熊猫平均每月滚动。我试图将它们都绘制在同一matplotlib图上,平均值作为条形图,而7天滚动平均值作为线形图。理想情况下,线应该是条形图顶部的图。

我遇到的问题是,在当前代码下,条形图显示为没有折线图,但是当我首先尝试绘制折线图时,我得到了ValueError: ordinal must be >= 1

这是该系列的样子:

这些是7天滚动平均值系列的前15个值,它具有日期和全年值:

date
2016-01-01         NaN
2016-01-03         NaN
2016-01-04         NaN
2016-01-05         NaN
2016-01-06         NaN
2016-01-07         NaN
2016-01-08    0.088473
2016-01-09    0.099122
2016-01-10    0.086265
2016-01-11    0.084836
2016-01-12    0.076741
2016-01-13    0.070670
2016-01-14    0.079731
2016-01-15    0.079187
2016-01-16    0.076395

这是整个月平均系列:

dt_month
2016-01-01    0.498323
2016-02-01    0.497795
2016-03-01    0.726562
2016-04-01    1.000000
2016-05-01    0.986411
2016-06-01    0.899849
2016-07-01    0.219171
2016-08-01    0.511247
2016-09-01    0.371673
2016-10-01    0.000000
2016-11-01    0.972478
2016-12-01    0.326921

这是我用来绘制它们的代码:

ax = series_one.plot(kind="bar", figsize=(20,2))
series_two.plot(ax=ax)
plt.show()

以下是生成的图形:

The graph my code generates 任何帮助深表感谢!同样,关于格式化这个问题和创建代码以使两个系列最少的工作示例的建议也很棒。

谢谢!

2 个答案:

答案 0 :(得分:1)

问题在于熊猫条形图是分类的(条形图位于随后的整数位置)。由于在您的情况下,这两个系列的元素数量不同,因此在分类坐标中绘制折线图实际上不是一种选择。剩下的就是在数字坐标中绘制条形图。对于熊猫来说这是不可能的,但这是matplotlib的默认行为。

下面,我将每月日期从每月的15天移到月中,以使条形居中。

import matplotlib.pyplot as plt
import numpy as np; np.random.seed(42)
import pandas as pd

t1 = pd.date_range("2018-01-01", "2018-12-31", freq="D")
s1 = pd.Series(np.cumsum(np.random.randn(len(t1)))+14, index=t1)
s1[:6] = np.nan

t2 = pd.date_range("2018-01-01", "2018-12-31", freq="MS")
s2 = pd.Series(np.random.rand(len(t2))*15+5, index=t2)

# shift monthly data to middle of month
s2.index += pd.Timedelta('15 days')


fig, ax = plt.subplots()

ax.bar(s2.index, s2.values, width=14, alpha=0.3)
ax.plot(s1.index, s1.values)

plt.show()

enter image description here

答案 1 :(得分:0)

问题可能出在两个系列的指标量表差异很大。您可以使用ax.twiny来绘制它们:

ax = series_one.plot(kind="bar", figsize=(20,2))
ax_tw = ax.twiny()
series_two.plot(ax=ax_tw)
plt.show()

输出:

enter image description here