我要用很高的密度绘制几个曲线,比如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:
但是,如果我在“调试”模式下运行代码并一步一步地运行它,那么我将得到一个包含完整xticklabels的预期值:
这真的很奇怪。总之,我只希望找到一种方法,可以确保我在正常的“运行”模式下获得所需的输出(第二个数字)。如何修改当前代码以实现此目的?在
提前谢谢!在
通常,^{} 对象使用^{} 对象计算并放置记号。} 替换它。这个问题还不够复杂,不足以编写您自己的,所以我建议^{} 非常适合您的需要。您的示例似乎与
Locator
s和Formatter
s意味着很容易被替换,使用Axis
的methods。默认的Locator
似乎没有为您提供任何功能,因此您可以使用^{nbins=16
(这是您在图片中看到的,因为有17个记号)。在您需要添加导入:
你需要换块
^{pr2}$与
或者只是
您可能需要使用其他参数(除了
nbins
),所有这些参数都必须是关键字。特别注意integer
。在注意,对于}。}是上面有刺的东西。
Locator
和Formatter
api,我们使用的是Axis
对象,而不是{Axes
是整个情节,而{Axes
通常包含两个Axis
对象和绘图中的所有其他内容。在您可以将xticks标签的可见性设置为
False
这将使每个第n个标签不可见。在
你的x轴数据是字符串。因此,每个数据点将得到一个勾号。这可能不是你想要的。而是使用日期来绘制。因为你用的是熊猫,这很容易转换
然后您就可以摆脱手动的xtick定位和格式化,因为matplotlib会自动为您选择一些不错的tick位置。在
^{pr2}$但是,如果您确实想手动控制位置和格式,可以使用
matplotlib.dates
定位器和格式化程序。在相关问题 更多 >
编程相关推荐