matplotlib 如何仅显示x轴上的第一个和最后一个刻度标签以及子图

xkrw2x1b  于 2023-03-13  发布在  其他
关注(0)|答案(1)|浏览(414)

为了在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()

6ju8rftf

6ju8rftf1#

由于x轴是一个字符串,x刻度不会在位置x,而是在位置0..len(sub_frame_sorted)-1。不管出于什么原因(有人可能会给出解释,但它看起来像一个bug),如果您调试axes[1].get_xticklabels()的Name Kate,您将看到:

[
 Text(-1.0, 0, '2022-07'),
 Text(0.0, 0, '2022-03'),
 Text(1.0, 0, '2022-04'),
 Text(2.0, 0, '2022-05'),
 Text(3.0, 0, '2022-06'),
 Text(4.0, 0, '2022-07'),
 Text(5.0, 0, '')
]

为了避免空标签或错误标签,您可以直接提供位置,因为您知道要绘制的数据(sub_frame_sorted):

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([0, len(sub_frame_sorted) - 1])

    plt.setp(axes[0].get_xticklabels(), rotation=0)
    plt.setp(axes[1].get_xticklabels(), rotation=0)

plt.show()

输出:

相关问题