Matplotlib - 将 Xticks 更改为线上的值而不是数据点

Posted

技术标签:

【中文标题】Matplotlib - 将 Xticks 更改为线上的值而不是数据点【英文标题】:Matplotlib - Changing Xticks to value on the line not a data point 【发布时间】:2017-03-26 19:41:07 【问题描述】:

我正在使用 matplotlib.pyplot (plt) 绘制温度与时间的关系图。我希望 xticks 只在上午 12 点和下午 12 点出现,matplot 自动选择 xticks 去哪里。

我如何准确地选择每个日期的上午 12 点和下午 12 点,因为我使用的数据没有这些数据点?基本上我想要一个 xtick 在两个数据点之间的点/两个数据点之间的线上。

下面是我的数据和函数的 sn-p。

 Temp   UNIX Time                Time
 5.04  1490562000 2017-03-26 22:00:00
 3.21  1490572800 2017-03-27 01:00:00
 2.15  1490583600 2017-03-27 04:00:00
 1.66  1490594400 2017-03-27 07:00:00
 6.92  1490605200 2017-03-27 10:00:00
11.73  1490616000 2017-03-27 13:00:00
13.77  1490626800 2017-03-27 16:00:00

def ploting_graph(self):
    ax=plt.gca()
    xfmt = md.DateFormatter('%d/%m/%y %p')
    ax.xaxis.set_major_formatter(locator)
    plt.plot(self.df['Time'],self.df['Temp'], 'k--^')
    plt.xticks(rotation=10)
    plt.grid(axis='both',color='r')
    plt.ylabel("Temp (DegC)")
    plt.xlim(min(self.df['Time']),max(self.df['Time']))
    plt.ylim(min(self.df['Temp'])-1,max(self.df['Temp'])+1)
    plt.title("Forecast Temperature ".format(self.location))
    plt.savefig('_day_forecast_.png'.format(self.num_of_days,self.location),dpi=300)

如您所见,我正在寻找 2017-03-27 00:00:00 和 12:00:00 的 xtick。

我们将不胜感激任何帮助,即使是朝着正确的方向推动也是非常棒的!非常感谢您的先进!

约翰。

【问题讨论】:

【参考方案1】:

您需要一个定位器和一个格式化程序。定位器确定您只需要每 12 小时一次的刻度,而格式化程序确定日期时间的外观。

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

dates = ["2017-03-26 22:00:00","2017-03-27 01:00:00","2017-03-27 04:00:00","2017-03-27 07:00:00",
         "2017-03-27 10:00:00","2017-03-27 13:00:00","2017-03-27 16:00:00"]
temps = [5.04, 3.21, 2.15,1.66, 6.92, 11.73, 13.77 ]

df = pd.DataFrame("Time":dates, "Temp":temps)
df["Time"] = pd.to_datetime(df["Time"], format="%Y-%m-%d %H:%M:%S")


fig, ax = plt.subplots()

xfmt = matplotlib.dates.DateFormatter('%d/%m/%y 12%p')
ax.xaxis.set_major_formatter(xfmt)

locator = matplotlib.dates.HourLocator(byhour=[0,12])
ax.xaxis.set_major_locator(locator)
plt.plot(df['Time'],df['Temp'], 'k--^')
plt.xticks(rotation=10)
plt.grid(axis='both',color='r')
plt.ylabel("Temp (DegC)")
plt.xlim(min(df['Time']),max(df['Time']))
plt.ylim(min(df['Temp'])-1,max(df['Temp'])+1)
plt.title("Forecast Temperature")

plt.show()

【讨论】:

【参考方案2】:

尝试在绘图中使用 xticks 函数。下面是我尝试的一个简单示例。

import matplotlib.pyplot as plt
x = [2,3,4,5,6,14,16,18,24,22,20]
y = [1, 4, 9, 6,5,6,7,8,9,5,7]
labels = ['12Am', '12Pm']
plt.plot(x, y, 'ro')
'12,24 are location on x-axis for labels'
plt.xticks((12,24),('12Am', '12Pm'))
plt.margins(0.2)
plt.show()

【讨论】:

问题在于问题中的 xvalues 是日期而不是整数,因此 12 或 24 实际上不在轴上。

以上是关于Matplotlib - 将 Xticks 更改为线上的值而不是数据点的主要内容,如果未能解决你的问题,请参考以下文章

如何在熊猫时间序列图中将 xticks 更改为年间隔

更改 matplotlib 中子图的“xticks”和“Yticks”的字体大小和粗体 [重复]

matplotlib - 子图中的 twinx 轴没有 xlabel 和 xticks

是否可以在 python 的 matplotlib 中包装 xticks 的文本?

如何使用 matplotlib 更改 xticks? [复制]

删除 matplotlib 图中的 xticks?