matplotlib Pyplot减少x轴刻度和标签的数量,并进行缩放[重复]

lymgl2op  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(131)

此问题在此处已有答案

Plotting time on the independent axis(5个答案)
How to use datetime.time to plot(3个答案)
How to get a matplotlib Axes instance(3个答案)
Plot Time Only in Matplotlib (Instead of DateTime)(1个答案)
14天前关门了。
在Matplotlib.pyplot中,我想知道如何减少x刻度和相应标签的数量***,这些标签会在缩放***时自动缩放/重新填充X轴。
使用import matplotlib.pyplot as plt导入
我所说的缩放的意思是:“如果我放大到图上的某个特定位置,它应该显示出该点附近最接近的x轴值。”
我的数据是一个电子表格(CSV中的pandas df)。我有超过1000个由Arduino记录的温度和时间戳。我想把这些绘制出来,看看我的传感器何时开始出现异常。
x1c 0d1x的数据
如果我正常绘制,绘图需要太多的时间来加载,它是缓慢的缩放和平移等,但当我放大,它显示我最近的X轴标签正确(因为我没有隐藏他们/做任何事情)。

产品代码:

plt.close()
plt.plot(df_31["Time"], df_31["T_One"], label = "T_1", color = "blue")
plt.plot(df_31["Time"], df_31["T_Two"], label = "T_2", color = "red")
plt.legend(loc = "upper right")
plt.show()

字符串

**输出:**缩小后无法读取

放大:

如果我尝试plt.xticks(df_31["Time"][::500]),它会显示我想要的显示类型 * 仅在主视图中 *。一旦我放大,x轴不会显示任何东西,而且都是空白的。

主视图:

**放大:**x1c4d 1x

我想看到整齐的看法正常,并有它的规模,并显示我适当的x轴值时,我放大。
尝试的解决方案:

# plt.xticks(df_31["Time"][::500]) # DOES NOT ZOOM.
# plt.locator_params(axis='x', tight = "True", nbins=6) # DOES NOT WORK, error = {'set_params()' not defined for locator of type}
# ax.set_xticks(ax.get_xticks()[::2]) # FOR OOP based matplotlib, not for pyplot.
# plt.gca().xaxis.set_major_locator(plt.MultipleLocator(250)) # DOES NOT ZOOM.


我读过很多S.O的帖子,尝试了多种建议的解决方案,但没有喜悦。没有以下链接在放大时工作,甚至没有人提到放大过程中面临的问题。一些在标准视图中工作,但当我放大时,一切都停止工作。
我已经阅读了以下链接,使用了glopes的建议:Changing the tick frequency on the x or y axis
THIS是最有希望的,但没有工作,抛出了一个错误。
This输出看起来与我面临的问题最相似,但他的是“R”,我的是Python。
How to adjust 'tick frequency' for string x-axis
Pyplot how to reduce xticks and xticklabels density?
controlling the number of x ticks in pyplot
尝试寻找上述错误here的解决方案,无法解决问题。
https://matplotlib.org/2.0.2/api/pyplot_api.html#matplotlib.pyplot.locator_params
https://matplotlib.org/3.4.3/gallery/ticks_and_spines/tick-locators.html
https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.locator_params.html
上面的大多数例子都是使用ax类型绘图(包括官方关于PyPLOT API的例子)。我使用plt类型绘图。
我讨厌matplotlib的这种二重性。为什么它必须如此混乱??我以前试过学习,只依赖轴。轴类型绘图,但在某些地方还需要pyplot模块。那么,基于复杂的OOP编程有什么用呢?我只是放弃了尝试正确理解和掌握matplotlib,而是使用band-在需要的时候帮助编程。我有一个成功工作的matplotlib命令的txt文件。我只是在需要的时候复制和粘贴它们,并编辑它们以适应我的需要。Seaborn等只是matplotlib穿着漂亮的衣服,所以他们会很好一段时间,直到我需要一些特定的东西,我将不得不在引擎盖下工作,这将再次是matplotlib。
我会很感激有人能帮助我使用PLT风格绘图。PLT是更容易和自我包含。它不需要轴的帮助。任何地方的轴,而轴。轴需要PLT工作。

b4lqfgs4

b4lqfgs41#

非常感谢RuthC指导我浏览评论。
主要的问题(绘制的每个时间戳)是由于我的时间戳是str类型的,而不是datetime对象。这导致matplotlib绘制它们。
在使用df_30["Time"] = pd.to_datetime(df_30["Time"])将格式更改为datetime对象后,df[“Time”]被转换为datetime对象而不是字符串。然而,问题是,取决于您是否使用format = "%H:%M:%S标志,日期将是01-01-1900或当前日期。
也就是说:如果使用
df_30["Time"] = pd.to_datetime(df_30["Time"], format = "%H:%M:%S")
你得到的时间从值为15:30:00str对象更改为值为1900-01-01 15:30:00datetime对象
如果使用
df_30["Time"] = pd.to_datetime(df_30["Time"])
您将获得值为2023-11-07 15:30:00datetime对象
如果日期不重要,您可以安全地忽略它们(只要您的数据既不超过一天,也不超过午夜)。

现在的问题是,plt将显示日期 * 和 * 时间,当你绘制它(* 没有秒 )。即,x轴刻度标签将读取01 15:3007 15:30取决于你使用的方法来转换日期。x1c 0d1x
但是,如果,你只想绘制时间戳(
或秒是重要的 *),你需要改变图的x-tick标签的格式。我是这样做的:

plt.plot(df_30["Time"], df_30["T_One"], label = "T_1", color = "blue")
plt.plot(df_30["Time"], df_30["T_Two"], label = "T_2", color = "red")
plt.legend(loc = "upper right")
plt.grid(which="major", alpha = 0.45)

thisaxesinstance = plt.gca()
thisaxesinstance.xaxis.set_major_formatter(matplotlib.dates.DateFormatter("%H:%M:%S"))

plt.show()

字符串
下一篇:

上面这几行的作用是:
thisaxesinstance = plt.gca()获取当前AXES示例(基本上是plt图)并将其分配给变量thisaxesinstance
thisaxesinstance.xaxis.set_major_formatter(matplotlib.dates.DateFormatter("%H:%M:%S"))获取thisaxesinstancexaxis,并使用set_major_formatter命令修改其格式。set_major_formatter被告知根据matplotlib.dates.DateFormatter("%H:%M:%S")化datetime对象,这是matplotlib自己的内置datetime模块。"%H:%M:%S"表示Hour:Minute:Second
在其他一些StackOverflow post中,michal.dul建议使用set_major_formatter,但打开matplotlib的documentation显示它是axes.Axes类型命令,而不是plt类型命令。
一个简单的解释方法,这对有帮助:thisaxesinstance = plt.gca()行将我们的plt类型转换为与axes.Axes命令兼容。

相关问题