如何降低xticks*和*xticklabels密度?

2024-04-26 03:03:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我要用很高的密度绘制几个曲线,比如1000个日期字符串。为了防止这些刻度标签相互重叠,我手动将它们设置为60个日期。代码如下:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

ts_index = pd.period_range(start="20060429", periods=1000).strftime("%Y%m%d")

fig = plt.figure(1)
ax = plt.subplot(1, 1, 1)
tick_spacing = 60

for i in range(5):
    plt.plot(ts_index, 1 + i * 0.01 * np.arange(0, 1000), label="group %d"%i)

plt.legend(loc='best')
plt.title(r'net value curves')

xticks = ax.get_xticks()
xlabels = ax.get_xticklabels()
ax.set_xticks(xticks[::tick_spacing])
ax.set_xticklabels(xlabels[::tick_spacing])


plt.xticks(rotation="vertical")
plt.xlabel(r'date')
plt.ylabel('net value')
plt.grid(True)
plt.show()

fig.savefig(r".\net_value_curves.png", )
fig.clf()

我用python3.6内核在PyCharm社区版2017.2.2中运行这段代码。现在有趣的是:每当我在正常的“运行”模式下运行代码(即,只要点击执行按钮,让代码“自由”运行,直到中断或终止),那么我得到的数字总是会错过xticklabels: enter image description here

但是,如果我在“调试”模式下运行代码并一步一步地运行它,那么我将得到一个包含完整xticklabels的预期值: enter image description here

这真的很奇怪。总之,我只希望找到一种方法,可以确保我在正常的“运行”模式下获得所需的输出(第二个数字)。如何修改当前代码以实现此目的?在

提前谢谢!在


Tags: 代码importnetvalueasnp模式fig
3条回答

通常,^{}对象使用^{}对象计算并放置记号。Locators和Formatters意味着很容易被替换,使用Axismethods。默认的Locator似乎没有为您提供任何功能,因此您可以使用^{}替换它。这个问题还不够复杂,不足以编写您自己的,所以我建议^{}非常适合您的需要。您的示例似乎与nbins=16(这是您在图片中看到的,因为有17个记号)。在

您需要添加导入:

from matplotlib.ticker import MaxNLocator

你需要换块

^{pr2}$

ax.xaxis.set_major_locator(MaxNLocator(nbins=16))

或者只是

ax.xaxis.set_major_locator(MaxNLocator(16))

您可能需要使用其他参数(除了nbins),所有这些参数都必须是关键字。特别注意integer。在

注意,对于LocatorFormatterapi,我们使用的是Axis对象,而不是{}。Axes是整个情节,而{}是上面有刺的东西。Axes通常包含两个Axis对象和绘图中的所有其他内容。在

您可以将xticks标签的可见性设置为False

for label in plt.gca().xaxis.get_ticklabels()[::N]:
                label.set_visible(False)

这将使每个第n个标签不可见。在

你的x轴数据是字符串。因此,每个数据点将得到一个勾号。这可能不是你想要的。而是使用日期来绘制。因为你用的是熊猫,这很容易转换

dates = pd.to_datetime(ts_index, format="%Y%m%d")

然后您就可以摆脱手动的xtick定位和格式化,因为matplotlib会自动为您选择一些不错的tick位置。在

^{pr2}$

enter image description here

但是,如果您确实想手动控制位置和格式,可以使用matplotlib.dates定位器和格式化程序。在

# tick every 3 months
plt.gca().xaxis.set_major_locator(mdates.MonthLocator((1,4,7,10)))
# format as "%Y%m%d"
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter("%Y%m%d"))

enter image description here

相关问题 更多 >

    热门问题