【问题标题】:How can I plot different length pandas series with matplotlib?如何使用 matplotlib 绘制不同长度的熊猫系列?
【发布时间】:2019-09-11 02:45:58
【问题描述】:

我有两个熊猫系列,一个是全年 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()

这是生成的图表:

非常感谢任何帮助!此外,关于格式化这个问题和创建代码以制作两个系列的最小工作示例的建议会很棒。

谢谢!!

【问题讨论】:

标签: python pandas matplotlib


【解决方案1】:

问题在于 pandas 条形图是分类的(条形图位于后续整数位置)。由于在您的情况下,这两个系列具有不同数量的元素,因此在分类坐标中绘制折线图并不是一个真正的选择。剩下的就是在数字坐标中绘制条形图。这对于 pandas 是不可能的,但这是 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()

【讨论】:

    【解决方案2】:

    问题可能是这两个系列的指数具有非常不同的规模。您可以使用ax.twiny 绘制它们:

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

    输出:

    【讨论】:

      猜你喜欢
      • 2015-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-15
      • 1970-01-01
      • 2020-09-12
      • 1970-01-01
      • 2020-03-02
      相关资源
      最近更新 更多