为了在x轴上只显示由matplotlib和panda.GroupBy生成的折线图和条形图中的第一个和最后一个刻度,我用下面的线表示。
然而只有条形图显示了你想要的。折线图在左上方有最近一个月的数据(应该在右上方),而在右边没有x记号。
哪里出了问题,我该如何纠正?
import matplotlib
import matplotlib.pyplot as plt
import pandas as pd
from io import StringIO
csvfile = StringIO(
"""
Name;Year - Month;Score;Upvote
Mike;2022-09;192;5
Mike;2022-08;708;5
Mike;2022-07;140;3
Mike;2022-05;144;8
Mike;2022-04;60;10
Mike;2022-03;108;4
Kate;2022-07;19850;5
Kate;2022-06;19105;2
Kate;2022-05;23740;3
Kate;2022-04;19780;9
Kate;2022-03;15495;4 """)
df = pd.read_csv(csvfile, sep = ';', engine='python')
for group_name, sub_frame in df.groupby("Name"):
fig, axes = plt.subplots(nrows=1,ncols=2,figsize=(10,5))
sub_frame_sorted = sub_frame.sort_values('Year - Month') # sort the data-frame by a column
sub_frame_sorted.plot(ax=axes[1], x="Year - Month", y="Score")
sub_frame_sorted.plot(ax=axes[0], kind='bar', x="Year - Month", y="Upvote")
axes[0].set_xticks([axes[0].get_xticks()[0], axes[0].get_xticks()[-1]])
axes[1].set_xticks([axes[1].get_xticks()[0], axes[1].get_xticks()[-1]])
plt.setp(axes[0].get_xticklabels(), rotation=0)
plt.setp(axes[1].get_xticklabels(), rotation=0)
plt.show()
1条答案
按热度按时间6ju8rftf1#
由于x轴是一个字符串,x刻度不会在位置x,而是在位置
0..len(sub_frame_sorted)-1
。不管出于什么原因(有人可能会给出解释,但它看起来像一个bug),如果您调试axes[1].get_xticklabels()
的NameKate
,您将看到:为了避免空标签或错误标签,您可以直接提供位置,因为您知道要绘制的数据(
sub_frame_sorted
):输出: