为什么刻度不适用日期格式?

时间:2018-11-22 23:24:03

标签: python matplotlib

我有这个简单的python代码,可以生成一个简单的X date y十进制图。

我的目标是将刻度设置为小于最小值的一个单位 TO 大于最大值的一个单位,请参见下面的代码和图。

我不明白为什么它不能正确显示X刻度,而Y刻度却显示得很好。

import matplotlib.pyplot as plt
import pandas as pd

fig = plt.figure(facecolor="#979899")
ax = plt.gca()
ax.set_facecolor("#d1d1d1")
ax.set_xlim(pd.to_datetime(["2018-11-18"]),pd.to_datetime(["2018-11-22"]))

plt.grid(True)
plt.title("This is a title",fontsize=16)

plt.yticks([0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0])
plt.xticks(pd.to_datetime(["2018-11-18","2018-11-20","2018-11-22"]))

x1 = pd.to_datetime(["2018-11-19","2018-11-20","2018-11-21"])
y1 = [0.18,0.32,0.21]


for i,item in enumerate(y1):
    xP = x1[i]
    yP = y1[i]
    plt.text(xP,yP,str(item)+"%",fontsize=11)

plt.scatter(x1,y1)
plt.plot(x1,y1)
plt.show()

enter image description here enter image description here

2 个答案:

答案 0 :(得分:0)

您为日期提供整数。因此Matplotlib将其视为任何数字。并且它试图对彼此靠近的大量数字很聪明:

  

默认格式化程序标识何时绘制的x数据是   小范围位于大偏移量之上。为了减少机会   ticklabels与刻度线重叠,标记为固定值的增量   偏移量。例如:

     

ax.plot(np.arange(2000, 2010), range(10))将具有0-9的刻度   +2e3的偏移量。如果不希望这样做,请关闭   默认格式化程序的偏移量:

     

ax.get_xaxis().get_major_formatter().set_useOffset(False)设置   rcParam axes.formatter.useoffset=False将其全局关闭或设置   不同的格式化程序。   来自docs of the matplotlib.ticker module

答案 1 :(得分:0)

我通过转换为datetime对象解决了该问题。在下面找到解决方案:

import matplotlib.pyplot as plt
import datetime

fig = plt.figure(facecolor="#979899")
ax = plt.gca()
ax.set_facecolor("#d1d1d1")
plt.grid(True)
plt.title("This is a title",fontsize=16)

plt.xticks([datetime.date(2018,11,20),datetime.date(2018,11,21),datetime.date(2018,11,22)],["11/20","11/21","11/22"])
plt.yticks([0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0],["0.0","0.1","0.2","0.3","0.4","0.5","0.6","0.7","0.8","0.9","1.0"])

x1 = [datetime.date(2018,11,20),datetime.date(2018,11,21),datetime.date(2018,11,22)]
y1 = [0.18,0.32,0.21]

for i,item in enumerate(y1):
    xP = x1[i]
    yP = y1[i]
    plt.text(xP,yP,str(item)+"%",fontsize=11)

plt.plot(x1,y1)
plt.show()