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 更改为线上的值而不是数据点的主要内容,如果未能解决你的问题,请参考以下文章
更改 matplotlib 中子图的“xticks”和“Yticks”的字体大小和粗体 [重复]
matplotlib - 子图中的 twinx 轴没有 xlabel 和 xticks
是否可以在 python 的 matplotlib 中包装 xticks 的文本?