【问题标题】:Why am I getting junk date values on x-axis in matplotlib?为什么我在 matplotlib 的 x 轴上得到垃圾日期值?
【发布时间】:2020-11-08 15:10:40
【问题描述】:

我是 Python 新手,正在使用 matplotlib 学习数据可视化。 我正在尝试使用此 CSV 文件中的matplotlib 绘制日期/时间与值:

https://drive.google.com/file/d/1ex2sElpsXhxfKXA4ZbFk30aBrmb6-Y3I/view?usp=sharing

下面是我一直在玩的代码sn-p:

import pandas as pd
from matplotlib import pyplot as plt
import matplotlib.dates as mdates

plt.style.use('seaborn')
years = mdates.YearLocator()
months = mdates.MonthLocator()
days = mdates.DayLocator()
hours = mdates.HourLocator()
minutes = mdates.MinuteLocator()
years_fmt = mdates.DateFormatter('%H:%M')

data = pd.read_csv('datafile.csv')
data.sort_values('Date/Time', inplace=True)

fig, ax = plt.subplots()
ax.plot('Date/Time', 'Discharge', data=data)

# format the ticks
ax.xaxis.set_major_locator(minutes)
ax.xaxis.set_major_formatter(years_fmt)
ax.xaxis.set_minor_locator(hours)
datemin = min(data['Date/Time'])
datemax = max(data['Date/Time'])
ax.set_xlim(datemin, datemax)
ax.format_xdata = mdates.DateFormatter('%Y.%m.%d %H:%M')
ax.format_ydata = lambda x: '%1.2f' % x  # format the price.
ax.grid(True)
fig.autofmt_xdate()
plt.show()

代码正在绘制图表,但它没有标记 X-Axis 并且还在右下角为 x 提供一些未知值(鼠标悬停),如下面的屏幕截图所示:

ma​​tplotlib图形窗口截图

有人可以建议需要进行哪些更改来绘制 x 轴日期并在我将光标移到图表上时显示正确的值吗?

谢谢

【问题讨论】:

    标签: python date datetime matplotlib


    【解决方案1】:

    我没用过matplotlib。相反,我使用pandas 绘图

    import pandas as pd
    
    data = pd.read_csv('datafile.csv')
    data.sort_values('Date/Time', inplace=True)
    data["Date/Time"] = pd.to_datetime(data["Date/Time"], format="%d.%m.%Y %H:%M")
    
    ax = data.plot.line(x='Date/Time', y='Discharge')
    

    这里需要将Date/Time转换为pandas datetime类型。

    【讨论】:

    • 这很好,但我想使用 matplotlib,因为它提供了一个底部工具栏来保存,而且我想将图形嵌入到 tkinter 窗口中。
    • @Nomi 使用plotly 可以吗?或者你只想要matplotlibplotly 还可以让你保存图表
    【解决方案2】:

    您遇到的主要问题是日期格式混淆了 - 您的数据使用 '%d.%m.%Y %H:%M',但您设置了 '%Y.%m.%d %H:%M',这就是为什么您在 x 刻度标签中看到“垃圾”值的原因。无论如何,如果您将 Date/Time 列转换为时间戳,则可以大大减少代码中的行数,即:

    import pandas as pd
    from matplotlib import pyplot as plt
    import matplotlib.dates as mdates
    
    plt.style.use('seaborn')
    
    data = pd.read_csv('datafile.csv')
    data.sort_values('Date/Time', inplace=True)
    data["Date/Time"] = pd.to_datetime(data["Date/Time"], format="%d.%m.%Y %H:%M")
    data.sort_values('Date/Time', inplace=True)
    
    fig, ax = plt.subplots()
    ax.plot('Date/Time', 'Discharge', data=data)
    ax.format_xdata = mdates.DateFormatter('%Y.%m.%d %H:%M')
    ax.tick_params(axis='x', rotation=45)
    ax.grid(True)
    fig.autofmt_xdate()
    plt.show()
    

    请注意,图中标签的格式取决于缩放级别,因此您需要放大图表的一部分才能看到刻度标签中的小时和分钟,但光标定位器位于底部栏窗口应始终显示光标下的详细时间戳。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多