【问题标题】:Why are my data not displayed in this Pandas graph?为什么我的数据没有显示在这个 Pandas 图表中?
【发布时间】:2020-11-22 15:58:49
【问题描述】:

我有一个pandas.DataFramedaily_data_f_no_nr,内容如下(print(daily_data_f_no_nr) 的结果):

          Day  Total TODO/TODOE count  First Derivative
0  2020-05-16                      35               0.0
1  2020-05-17                      35               0.0
2  2020-05-18                      35               0.0
3  2020-05-19                      35               0.0
4  2020-05-20                      35               0.0
..        ...                     ...               ...
74 2020-07-29                     152               0.0
75 2020-07-30                     152               0.0
76 2020-07-31                     152               0.0
77 2020-08-01                     152               0.0
78 2020-08-02                     152               0.0

我想创建一个折线图

  • Day 在 x 轴上并且
  • Total TODO/TODOE countFirst Derivative 在 y 轴上。

我为此使用以下代码:

fig = daily_data_f_no_nr.plot(kind='line', figsize=(20, 16), fontsize=26, xticks=daily_data_f_no_nr['Day'], yticks=daily_data_f_no_nr['Total TODO/TODOE count'], y=['Total TODO/TODOE count', 'First Derivative']).get_figure()
fig.savefig(CHART_FILE)

CHART_FILE 看起来像这样:

没有绘制代表Total TODO/TODOE countFirst Derivative 的线条。

我做错了什么?我如何需要更改上面的代码才能生成如下所示的图表(x 轴上的日期, Total TODO/TODOE countFirst Derivative 在 y)?

更新1:如果我将代码更改为

fig = daily_data_f_no_nr.plot(kind='line', figsize=(20, 16), fontsize=26, xticks=daily_data_f_no_nr['Day'], yticks=daily_data_f_no_nr['Total TODO/TODOE count'],x='Day', y=['Total TODO/TODOE count', 'First Derivative']).get_figure()

我得到了错误

Traceback (most recent call last):
  File "py\todo-count-delta.py", line 113, in <module>
    fig = daily_data_f_no_nr.plot(kind='line', figsize=(20, 16), fontsize=26, xticks=daily_data_f_no_nr['Day'], yticks=daily_data_f_no_nr['Total TODO/TODOE count'],x='Day', y=['Total TODO/TODOE count', 'First Derivative']).get_figure()
  File "C:\Users\User\anaconda3\lib\site-packages\pandas\plotting\_core.py", line 847, in __call__
    return plot_backend.plot(data, kind=kind, **kwargs)
  File "C:\Users\User\anaconda3\lib\site-packages\pandas\plotting\_matplotlib\__init__.py", line 61, in plot
    plot_obj.generate()
  File "C:\Users\User\anaconda3\lib\site-packages\pandas\plotting\_matplotlib\core.py", line 266, in generate
    self._adorn_subplots()
  File "C:\Users\User\anaconda3\lib\site-packages\pandas\plotting\_matplotlib\core.py", line 476, in _adorn_subplots
    ax.set_xticks(self.xticks)
  File "C:\Users\User\anaconda3\lib\site-packages\matplotlib\axes\_base.py", line 3350, in set_xticks
    ret = self.xaxis.set_ticks(ticks, minor=minor)
  File "C:\Users\User\anaconda3\lib\site-packages\matplotlib\axis.py", line 1755, in set_ticks
    self.set_view_interval(min(ticks), max(ticks))
  File "C:\Users\User\anaconda3\lib\site-packages\matplotlib\axis.py", line 1892, in setter
    setter(self, min(vmin, vmax, oldmin), max(vmin, vmax, oldmax),
TypeError: '<' not supported between instances of 'numpy.float64' and 'Timestamp'

更新2:这是print(daily_data_f_no_nr.info())的输出:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 79 entries, 0 to 78
Data columns (total 3 columns):
 #   Column                  Non-Null Count  Dtype
---  ------                  --------------  -----
 0   Day                     79 non-null     datetime64[ns]
 1   Total TODO/TODOE count  79 non-null     int64
 2   First Derivative        79 non-null     float64
dtypes: datetime64[ns](1), float64(1), int64(1)
memory usage: 2.0 KB
None

【问题讨论】:

    标签: python pandas datetime matplotlib data-visualization


    【解决方案1】:

    选项1:使用Day列作为x参数

    你应该添加x = 'Day'参数:

    fig = daily_data_f_no_nr.plot(kind='line', figsize=(20, 16), fontsize=26, xticks=daily_data_f_no_nr['Day'], yticks=daily_data_f_no_nr['Total TODO/TODOE count'], x = 'Day', y=['Total TODO/TODOE count', 'First Derivative']).get_figure()
    

    使用您在上面提供的数据(仅数据框的开头和结尾):


    选项2:将Day列设置为数据框的索引

    您可以将Day 列设置为数据框的索引:

    daily_data_f_no_nr.set_index('Day', inplace = True)
    

    现在你可以用:

    fig = daily_data_f_no_nr.plot(kind='line', figsize=(20, 16), fontsize=26, xticks=daily_data_f_no_nr.index, yticks=daily_data_f_no_nr['Total TODO/TODOE count'], y=['Total TODO/TODOE count', 'First Derivative']).get_figure()
    

    你会得到和上面一样的情节。


    完整代码

    import pandas as pd
    import matplotlib.pyplot as plt
    
    daily_data_f_no_nr = pd.read_csv('data.csv')
    daily_data_f_no_nr['Day'] = pd.to_datetime(daily_data_f_no_nr['Day'], format = '%Y-%m-%d')
    
    daily_data_f_no_nr.set_index('Day', inplace = True)
    
    fig = daily_data_f_no_nr.plot(kind='line', figsize=(20, 16), fontsize=26, xticks=daily_data_f_no_nr.index, yticks=daily_data_f_no_nr['Total TODO/TODOE count'], y=['Total TODO/TODOE count', 'First Derivative']).get_figure()
    
    plt.show()
    

    【讨论】:

    • 谢谢。我试过你的建议。请参阅问题文本中的更新 1
    • 该错误可能是由于缺少值,请检查它们。此外,一列中可能有“奇怪”的值(可能是NaN?);请提供print(daily_data_f_no_nr.info())的输出
    • 广告请提供print(daily_data_f_no_nr.info())的输出:见更新2。
    • 您能否提供您的数据框,以便进行检查?
    • 我更新了我的答案。如果您再次遇到错误,请编辑问题并发布您的整个数据集以进行检查。
    猜你喜欢
    • 2021-02-15
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 2013-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多