在绘制价格与时间的数据时动态减少 matplotlib 中的 xticks 数量

Reduce the number of xticks in matplotlib dynamically while plotting data of prices vs time

我的 python matplotlib 脚本:

plt.plot(graphdf["Price"],color='red')
plt.xticks(rotation=90)

需要动态减少刻度数的帮助,我的程序不断地抓取数据,并且在绘制它时 x 轴在一段时间后变得混乱,比如在大约 40 个 xtick 标签之后.

(我没有固定数量的数据点,每次我的程序抓取额外数据时它都会不断增长例如:在 9:37 我只有 3 个数据点,在 9:45 我将有 5 个数据点等。我在下图中连续绘制它)

我有一个简单的数据集,其中包含价格与时间(股票市场价格)的关系,如下所示:

我的图表是这样的

选项 1:x 轴 datetime 类型

回答

我想你的数据在一个名为 data.csv 的文件中。如果用pd.read_csv加载,需要注意'Time'列的格式。查看输出:

print(graphdf.info())

如果 'Time' 列的 DTypeobjectpandas 将此列的值标识为 str。在这种情况下,您需要使用以下方法将它们转换为 datetime

graphdf['Time'] = pd.to_datetime(graphdf['Time'], format = '%H:%M')

最后,您可以设置在 x 轴上看到的标签格式:

ax.xaxis.set_major_formatter(md.DateFormatter('%H:%M'))

检查 以供参考。


完整代码

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as md

graphdf = pd.read_csv('data.csv')
graphdf['Time'] = pd.to_datetime(graphdf['Time'], format = '%H:%M')

fig, ax = plt.subplots()

ax.plot(graphdf['Time'],graphdf['Price'],color='red')
plt.xticks(rotation=90)
ax.xaxis.set_major_formatter(md.DateFormatter('%H:%M'))

plt.show()

情节


选项 2:x 轴 str 类型

回答

如果您不希望 x 轴作为一般时间 %H:%M 轴,但又想保留原始刻度,则必须将 x 轴保持为 str 类型并且简单地采样原始刻度,然后将它们应用于轴:

xticks = graphdf['Time'][::2]
ax.set_xticks(xticks)

您可以 slice 原始报价与 [::n],其中 n 是步骤。如果 n = 2 您选择了替代报价;如果 n = 3 你每 3 次选择一个刻度,依此类推。

完整代码

import pandas as pd
import matplotlib.pyplot as plt

graphdf = pd.read_csv('data.csv')

fig, ax = plt.subplots()

ax.plot(graphdf['Time'],graphdf['Price'],color='red')
plt.xticks(rotation=90)
xticks = graphdf['Time'][::2]
ax.set_xticks(xticks)

plt.show()

情节