当前位置: 首页 > 知识库问答 >
问题:

Matplotlib:带有高度标签的子地块条形图

程谦
2023-03-14

我有一个数据框架,df,就像:

continent | country   | counts
------------------------------
East Asia | Hong Kong | 33
East Asia | Japan     | 51
Europe    | Austria   | 10
Europe    | Belgium   | 3
Europe    | Denmark   | 15

我想绘制两个垂直条形图,每个大陆一个,并排,共享相同的y轴。我已经完成了90%的工作,除了将条的高度添加到子图中。到目前为止,我的代码:

continents_ls = list(set(df["continent"]))
# continents_ls = ["East Asia", "Europe"]

fig, ax = plt.subplots(1, len(continents_ls), figsize=(30, len(continents_ls)*5), sharey=True)

for i in range(len(continents_ls)):
    d_temp = df.loc[df["continent"] == continents_ls[i]].groupby("country").size().to_frame().reset_index()
    # d_temp is the partition containing info for just one continent
    d_temp.columns = ["country", "count"] # name the 'count' column
    idx = list(d_temp["country"]) # get the list of countries in that continent
    ht_arr = list(d_temp["count"])
    ax[i].bar(left=range(len(ht_arr)), height=ht_arr)
    ax[i].set_xticks(np.arange(len(idx)))
    ax[i].set_xticklabels(idx, size=8, rotation=45)
    ax[i].set_title(continents_ls[i], size=23)
    ax[i].set_yticklabels(ht_arr, minor=False)

plt.tight_layout()
plt.show()

我在这里和那里看到过带有标签的示例,但这些往往只适用于一个条形图,而不是几个子图。

共有1个答案

公良弘毅
2023-03-14

只需对代码稍加修改,就可以做到这一点。用这个答案:https://stackoverflow.com/a/34598688/42346

for i in range(len(continents_ls)):
    d_temp = df.loc[df["continent"] == continents_ls[i]].groupby("country").size().to_frame().reset_index()
    # d_temp is the partition containing info for just one continent
    d_temp.columns = ["country", "count"] # name the 'count' column
    idx = list(d_temp["country"]) # get the list of countries in that continent
    ht_arr = list(d_temp["count"])
    ax[i].bar(left=range(len(ht_arr)), height=ht_arr)
    ax[i].set_xticks(np.arange(len(idx)))
    ax[i].set_xticklabels(idx, size=8, rotation=45)
    ax[i].set_title(continents_ls[i], size=23)
    ax[i].set_yticklabels(ht_arr, minor=False)
    if i == 0: # only for the first barplot
      for p in ax[i].patches:
        ax[i].annotate("%.2f" % p.get_height(), (p.get_x() + p.get_width() / 2., p.get_height()), ha='center', va='center', xytext=(0, 10), textcoords='offset points')
 类似资料:
  • 问题内容: 我希望降低不同子地块上的刻度标签密度 结果呢![输入图像描述] 这里 我想减少上面两个子地块的记号标签。怎么做 ? 谢谢。 奖励:1)如何去除条形图上y=0的虚线? 2) 如何去除子图0和1之间的x-trick标签?3) 如何设置 后面的情节要透明吗?(请参见右下角断开的y轴线。) 消失在情节背后) 问题答案: 您可以像设置xticks一样,将记号设置到您想要的位置。 这将为ax0子批

  • 在Matplotlib中创建子地块数组时,有没有一种方法可以完全去掉勾号标签?我目前需要根据绘图对应的较大数据集的行和列指定每个绘图。我尝试使用ax.setxticks([])和类似的y轴命令,但没有成功。 我认识到,这可能是一个不寻常的要求,希望作出一个绘图没有轴数据,但这是我需要的。我需要它自动应用于数组中的所有子地块。

  • 问题内容: 我陷入一种感觉应该相对容易的事情上。我在下面提供的代码是基于我正在从事的一个较大项目的示例。我没有理由发布所有详细信息,因此请原样接受我带来的数据结构。 基本上,我正在创建一个条形图,我可以弄清楚如何在条形图上(在条形图的中心或上方)添加值标签。一直在网上查看示例,但在我自己的代码上实现未成功。我相信解决方案是使用“文本”或“注释”,但是我:a)不知道要使用哪个(通常来说,还没有弄清楚

  • 我试图在堆叠条形图中“稳健地”居中数据标签。下面给出了一个简单的代码示例和结果。如您所见,数据标签并不是在所有矩形中都居中。我错过了什么?

  • 问题内容: 在尝试与matplotlib斗争比我想承认的更长的时间之后,我尝试在我使用过的几乎所有其他绘图库中轻而易举地做些事情,之后,我决定向Stackiverse寻求一些见识。简而言之,我需要创建多个水平条形图,它们全部共享x轴,在y轴上具有不同数量的值,并且所有条形具有相同的高度,而图表本身可以调整为条目。我需要绘制的简化数据结构如下所示: 结果,最接近我想要使用的是: 无论有多少个条目具有

  • 我试图创建一个由2x2网格组成的图形,其中每个象限有两个垂直堆叠的子图(即2x1网格)。不过,我似乎不知道如何实现这一点。 我得到的最接近的是使用gridspec和一些丑陋的代码(见下文),但是因为改变了所有子图的行间距,所以我仍然不在我想去的地方。 理想情况下,我想要的是,以下图为例,减少每个象限内子地块之间的间距,同时增加顶部和底部象限之间的垂直间距(即1-3和2-4之间)。 有没有办法做到这