在matplotlib中调整x轴

时间:2018-04-30 10:17:03

标签: python matplotlib data-science

我每年的每个小时都有一系列的价值观。这意味着有24 x 365 = 8760个值。我想用matplotlib整齐地绘制这些信息,x轴显示1月,2月...... 这是我目前的代码:

from matplotlib import pyplot as plt

plt.plot(x_data,y_data,label=str("Plot"))
plt.xticks(rotation=45)
plt.xlabel("Time")
plt.ylabel("Y axis values")
plt.title("Y axis values vs Time")
plt.legend(loc='upper right')
axes = plt.gca()
axes.set_ylim([0,some_value * 3])
plt.show() 

x_data是一个包含datetime格式日期的列表。 y_data包含与x_data中的值对应的值。如何在X轴上完成几个月的整理情节?一个例子:

enter image description here

1 个答案:

答案 0 :(得分:0)

您可以创建一个以水平线作为标记的scatter plot。使用datetime module提取月份。如果未订购日期,则绘图将根据日期首先对两个列表进行排序:

#creating a toy dataset for one year, random data points within month-specific limits
from datetime import date, timedelta
import random
x_data = [date(2017, 1, 1) + timedelta(days = i) for i in range(365)]
random.shuffle(x_data)
y_data = [random.randint(50 * (i.month - 1), 50 * i.month) for i in x_data]

#the actual plot starts here
from matplotlib import pyplot as plt
#get a scatter plot with horizontal markers for each data point
#in case the dates are not ordered, sort first the dates and the y values accordingly 
plt.scatter([day.strftime("%b") for day in sorted(x_data)], [y for _xsorted, y in  sorted(zip(x_data, y_data))], marker = "_", s = 900)
plt.show()

输出
enter image description here

缺点显然是线条具有固定长度。此外,如果一个月没有数据点,它将不会出现在图表中。

编辑1:
您也可以使用Axes.hlines,如here所示 这具有以下优点:线长度随窗口大小而变化。而且您不必对列表进行预排序,因为每个起点和终点都是单独计算的。 玩具数据集按上述方式创建。

from matplotlib import pyplot as plt
#prepare the axis with categories Jan to Dec
x_ax = [date(2017, 1, 1) + timedelta(days = 31 * i) for i in range(12)]
#create invisible bar chart to retrieve start and end points from automatically generated bars
Bars = plt.bar([month.strftime("%b") for month in x_ax], [month.month for month in x_ax], align = "center", alpha = 0)
start_1_12 = [plt.getp(item, "x") for item in Bars]
end_1_12   = [plt.getp(item, "x") + plt.getp(item, "width") for item in Bars]
#retrieve start and end point for each data point line according to its month
x_start = [start_1_12[day.month - 1] for day in x_data]
x_end = [end_1_12[day.month - 1] for day in x_data]

#plot hlines for all data points
plt.hlines(y_data, x_start, x_end, colors = "blue")
plt.show()

输出enter image description here

编辑2:
现在,您对问题的描述与您在问题中显示的内容完全不同。您需要一个具有特定轴格式的简单线图。这可以在matplotlib文档和SO中轻松找到。例如,如何使用上面创建的玩具数据集实现这一目标:

import matplotlib.pyplot as plt
from matplotlib.dates import DateFormatter, MonthLocator

ax = plt.subplot(111)
ax.plot([day for day in sorted(x_data)], [y for _xsorted, y in  sorted(zip(x_data, y_data))], "r.-")
ax.xaxis.set_major_locator(MonthLocator(bymonthday=15))
ax.xaxis.set_minor_locator(MonthLocator())
ax.xaxis.set_major_formatter(DateFormatter("%B"))
plt.show()

输出 enter image description here