为什么在matplotlib中x轴上出现垃圾日期值?

5

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

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

以下是我一直在尝试的代码片段:

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轴加标签,并在右下角显示一些未知值(鼠标悬停时),如下面的截图所示:

matplotlib图形窗口的屏幕截图:

请问有人能提出需要哪些更改以绘制X轴日期,并使移动光标至图形上时正确的值显示吗?
谢谢。
2个回答

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日期时间类型。

enter image description here


很好,但我想使用matplotlib,因为它提供了底部工具栏来保存,并且我想将图表嵌入tkinter窗口中。 - Nomi
@Nomi,使用 plotly 可以吗?或者你只需要 matplotlibplotly 还可以让你保存图形。 - bigbounty

1
你所遇到的主要问题是日期格式混淆了 - 你的数据使用的是 '%d.%m.%Y %H:%M' 格式,但你设置的是 '%Y.%m.%d %H:%M' 格式,这就是为什么在 x 轴标签中看到 'rubbish' 值的原因。无论如何,如果你将 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()

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接