Python Matplotlib时间序列图X轴日期间距调整问题排查
问题分析:时间序列图X轴日期无法铺满绘图区域
你提到用Python绘制时间序列图时,日期没能铺满整个绘图区域,咱们来拆解代码里的几个关键问题:
核心问题点
日期顺序被打乱
你用x2 = pd.Series(list(set(x2)))处理日期,而set是无序结构,这会直接打乱原本的时间顺序,导致X轴标签和实际时间序列数据完全不对应。绘图X轴与刻度标签不匹配
绘图时用range(len(s_pos))和range(len(s_neg))作为数据的X轴位置,但设置刻度时却用去重后的x2的长度来生成刻度位置,这会让数据的实际X范围和刻度的X范围脱节,自然无法铺满整个绘图区域。xlim设置与数据范围不符
axes.set_xlim(0, len(y2))里的len(y2)是去重后日期的数量,但s_pos/s_neg的长度可能和这个数值不一致,导致绘图区域的X范围和数据的实际范围不匹配。margins设置方式错误
axes.margins = 0的写法不生效,正确的调用应该是axes.margins(x=0),通过方法来设置边距。
代码具体问题拆解
你的代码片段里的关键问题点标注如下:
x2 = all_sentiment['date'] x2 = pd.Series(list(set(x2))) # ❶ 这里打乱了日期的时间顺序! y2 = all_sentiment['sent_count'] fig, axes = plt.subplots(nrows=1, ncols=1, figsize=(20, 10)) # ❷ 用range作为X轴位置,和日期没有直接关联 axes.plot(range(len(s_pos)), s_pos, linewidth=2, color='green') axes.plot(range(len(s_neg)), s_neg, linewidth=2, color='red') #axes.set_xticks(x2.index.tolist()) # ❸ 刻度位置是去重后的日期数量,但绘图的X范围是s_pos的长度,两者不匹配 axes.set_xticks(np.arange(len(x2.index.tolist()))) # ❹ 因为x2顺序被打乱,这里的日期标签也是乱序的 axes.set_xticklabels([date.strftime("%Y-%m-%d") for date in x2]) axes.margins = 0 # ❺ 错误的设置方式,应该用axes.margins(x=0) axes.set_xlabel('Date/Time') axes.set_ylabel('Num of Tweets') axes.set_title('Number of Tweets Over Time - Positive and Negative') # ❻ xlim上限是len(y2),但数据的X最大是len(s_pos)-1,范围不匹配 axes.set_xlim(0, len(y2)) axes.legend(loc="upper right", labels=['Positive', 'Negative']) fig.subplots_adjust(hspace=1) plt.show()
本质上是你把数据的X轴位置、日期标签的顺序、绘图区域的X范围这三者的对应关系完全搞混了,才导致日期无法铺满绘图区域,甚至标签和数据完全错位。
内容的提问来源于stack exchange,提问作者girlrilaz
相关产品推荐
相关产品推荐

