我每年的每个小时都有一系列的价值观。这意味着有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轴上完成几个月的整理情节?一个例子:
答案 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()
缺点显然是线条具有固定长度。此外,如果一个月没有数据点,它将不会出现在图表中。
编辑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()
编辑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()