【问题标题】:Plot dataframe in Python在 Python 中绘制数据框
【发布时间】:2021-06-10 09:26:19
【问题描述】:

我是 Python 新手。我希望你能帮助我。 我有一个包含两列的数据框。第一列称为日期,第二列填充数字。数据框有 351 行。

dates        numbers
01.03.2019   5
02.03.2019   8
...
20.02.2020   3
21.02.2020   2

我希望整个第一列都在 x 轴上。我试着把它画成这样:

graph = FinalDataframe.plot(figsize=(12, 8))

graph.legend(loc='upper center', bbox_to_anchor=(0.5, -0.075), ncol=4)

graph.set_xticklabels(FinalDataframe['dates'])

plt.show()

但在 x 轴上只是列中的前几个值,而不是整个列。此外,它们与第二列中的数据不相关。

有什么建议吗?

提前谢谢你!

【问题讨论】:

    标签: python pandas dataframe matplotlib plot


    【解决方案1】:

    您的问题是 x 刻度是自动生成的,并且间隔开以便于阅读。但是,您告诉 matplotlib 使用所有标签。简单的解决方法是告诉他每个条目使用一个刻度标签,但这会使您的 x 轴不可读:

    graph.set_xticks(range(len(FinalDataframe['dates'])))
    

    现在您可以手动将它们隔开:

    graph.set_xticks(range(0, len(FinalDataframe['dates']), 61))
    graph.set_xticklabels(FinalDataframe['dates'][::61])
    

    然而,在 x 轴上绘制日期的最佳结果仍然是使用 pandas 的内置日期对象。我们可以通过pd.to_datetime 做到这一点

    这也将允许 pandas 知道在 x 轴上放置点的位置,方法是指定您希望 x 轴为日期。这样,如果日期未排序或丢失,将正确跳过间隙,并且点将位于正确日期的纵坐标上方。

    我首先重新创建一个看起来像您发布的数据框:

    >>> df = pd.DataFrame({'dates': pd.date_range('20190301', '20200221', freq='D').strftime('%d.%m.%Y'), 'numbers': np.random.randint(0, 10, 358)})
    >>> df
              dates  numbers
    0    01.03.2019        2
    1    02.03.2019        2
    2    03.03.2019        5
    3    04.03.2019        4
    4    05.03.2019        3
    ..          ...      ...
    353  17.02.2020        2
    354  18.02.2020        1
    355  19.02.2020        2
    356  20.02.2020        3
    357  21.02.2020        1
    

    (这应该和FinalDataFrame一样,或者如果你的日期是索引,那么它和FinalDataFrame.reset_index()一样)

    现在我正在转换日期:

    >>> df['dates'] = pd.to_datetime(df['dates'], format='%d.%m.%Y')
    >>> df
             dates  numbers
    0   2019-03-01        2
    1   2019-03-02        2
    2   2019-03-03        5
    3   2019-03-04        4
    4   2019-03-05        3
    ..         ...      ...
    353 2020-02-17        2
    354 2020-02-18        1
    355 2020-02-19        2
    356 2020-02-20        3
    357 2020-02-21        1
    

    您可以通过检查其dtypes 来检查您的列是否包含日期而不是日期的字符串表示:

    >>> df.dtypes
    dates      datetime64[ns]
    numbers             int64
    

    终于出图了:

    >>> ax = df.plot(x='dates', y='numbers', figsize=(12, 8))
    >>> ax.legend(loc='upper center', bbox_to_anchor=(0.5, -0.075), ncol=4)
    <matplotlib.legend.Legend object at 0x7fc8c24fd4f0>
    >>> plt.show()
    

    图例会自动处理。这就是你得到的:

    【讨论】:

    • 不客气@Lisa!下一个问题尝试发布您的数据框(或其中的一部分)simply the output of print(df) is very helpful,如果您有绘图问题,请尝试包含您获得的屏幕截图(或指向它的链接),并描述您想要实现的目标反而。这将使人们更容易回复!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 2015-09-29
    • 2013-11-03
    • 2021-11-07
    • 2016-01-07
    • 1970-01-01
    • 2021-06-09
    相关资源
    最近更新 更多