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

使用与绘图的x轴和y轴无关的附加值注释熊猫条形图

申屠锦
2023-03-14

我正在制作一个熊猫柱状图,图中显示了原始计数,但是我想用这些计数的百分比作为一个整体来标注柱状图。我见过很多人使用< code>ax.patches方法来注释,但是我的值与实际条的< code>get_height无关。

这是一些玩具数据。产生的图将是特定类型的单个计数。但是,我想在这个特定的条上添加注释,表示这个特定类型对这个人的姓名的所有类型的百分比总和。

如果您需要更多澄清,请告诉我。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt


d = {'ID': [1,1,1,2,2,3,3,3,4], 
     'name': ['bob','bob','bob','shelby','shelby','jordan','jordan','jordan','jeff'],
     'type': ['type1','type2','type4','type1','type6','type5','type8','type2',None]}
df: pd.DataFrame = pd.DataFrame(data=d)

df_pivot: pd.DataFrame = df.pivot_table(index='type', columns=['name'], values='ID', aggfunc={'ID': np.sum}).fillna(0)

# create percent totals of the specific type's row of the total
df_pivot['bob_pct_total']: pd.Series = (df_pivot['bob']/df_pivot['bob'].sum()).mul(100).round(1)
df_pivot['shelby_pct_total']: pd.Series = (df_pivot['shelby']/df_pivot['shelby'].sum()).mul(100).round(1)
df_pivot['jordan_pct_total']: pd.Series = (df_pivot['jordan']/df_pivot['jordan'].sum()).mul(100).round(1)
df_pivot.head(10)

name    bob jordan  shelby  bob_pct_total   shelby_pct_total    jordan_pct_total
type                        
type1   1.0   0.0      2.0           33.3               50.0                0.0
type2   1.0   3.0      0.0           33.3                0.0               33.3
type4   1.0   0.0      0.0           33.3                0.0                0.0
type5   0.0   3.0      0.0            0.0                0.0               33.3
type6   0.0   0.0      2.0            0.0               50.0                0.0
type8   0.0   3.0      0.0            0.0                0.0               33.3

fig, ax = plt.subplots(figsize=(15,15))
df_pivot.plot(kind='bar', y=['bob','jordan','shelby'], ax=ax)

共有1个答案

薛华容
2023-03-14

您可以使用旧的方法,在条形图中循环,使用高度来定位您想要的任何文本。从matplotlib 3.4.0开始,还有一个新函数bar_label可以删除大部分样板文件:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

d = {'ID': [1, 1, 1, 2, 2, 3, 3, 3, 4],
     'name': ['bob', 'bob', 'bob', 'shelby', 'shelby', 'jordan', 'jordan', 'jordan', 'jeff'],
     'type': ['type1', 'type2', 'type4', 'type1', 'type6', 'type5', 'type8', 'type2', None]}
df: pd.DataFrame = pd.DataFrame(data=d)

df_pivot: pd.DataFrame = df.pivot_table(index='type', columns=['name'], values='ID', aggfunc={'ID': np.sum}).fillna(0)

# create percent totals of the specific type's row of the total
df_pivot['bob_pct_total']: pd.Series = (df_pivot['bob'] / df_pivot['bob'].sum()).mul(100).round(1)
df_pivot['shelby_pct_total']: pd.Series = (df_pivot['shelby'] / df_pivot['shelby'].sum()).mul(100).round(1)
df_pivot['jordan_pct_total']: pd.Series = (df_pivot['jordan'] / df_pivot['jordan'].sum()).mul(100).round(1)

fig, ax = plt.subplots(figsize=(12, 5))
columns = ['bob', 'jordan', 'shelby']
df_pivot.plot(kind='bar', y=['bob', 'jordan', 'shelby'], rot=0, ax=ax)
for bars, col in zip(ax.containers, ['bob_pct_total', 'jordan_pct_total', 'shelby_pct_total']):
    ax.bar_label(bars, labels=['' if val == 0 else f'{val}' for val in df_pivot[col]])
plt.tight_layout()
plt.show()

PS:要跳过标记第一个条形,您可以尝试:

for bars, col in zip(ax.containers, ['bob_pct_total', 'jordan_pct_total', 'shelby_pct_total']):
    labels=['' if val == 0 else f'{val}' for val in df_pivot[col]]
    labels[0] = ''
    ax.bar_label(bars, labels=labels)
 类似资料:
  • 通过使用matplotlib,我想绘制随时间变化的训练精度、验证精度、训练误差和验证误差。x轴是所有曲线的迭代次数。我想为精度值保留左x轴,为损耗值保留右y轴,然后在同一个图上绘制所有四个。 为了做到这一点,我尝试了几件事,最后我没有达到我想要的程度。 有人能帮我吗? 我的代码(没有按我的要求工作): 我想这样做(但我没有3条曲线,而是4条曲线)(我从这里拍摄图像:https://datascie

  • 我很难创建一个条形图,其中包含两个不同的y轴和每个x值(类别)的两个条形图。我有不同类型的数据类别(见下文),每个类别我都有两个值,我想并排绘制(和)。但是,每个类别的值相距甚远,这使得类别的条形几乎不可见。因此,我想添加第二个y轴(一个用于,一个用于),以允许在两个类别之间进行比较。 示例数据: 我使用下面的R代码(ggplot2)来创建绘图: 和,但我没有设法将y轴分配给数据类型。 我很高兴每

  • Highcharts 区域图 以下实例演示了反转x轴与y轴区域图。 我们在前面的章节已经了解了 Highcharts 基本配置语法。接下来让我们来看下其他的配置。在 chart 中添加 inverted 属性。 chart 配置 将 chart 的 inverted 属性设置为 true,X轴为垂直,Y轴为水平的。 var chart = { type: 'area', invert

  • 在下面的代码中,我希望减小y轴和x轴值的字体大小。我搜索并找到了以下代码: 假设您想减少数轴的字体大小,请使用以下代码: 假设要减小CategoryAxis的字体大小,请使用以下代码: 但不幸的是,轴的大小并没有减小。我做错什么了吗? 此示例代码:

  • 我正在使用库MPAndroid,< code >编译' com . github . philjay:MPAndroidChart:v 3 . 0 . 0-beta 1 ' 我必须在MPAndroid折线图中传递x轴上的日期和y轴上的值,当我传递x轴或y轴上的值时,应用程序崩溃,显示< code > ArrayIndexOutOfBound < code >异常,数组大小为-2。 我怎么能做到这一

  • 我的x轴值没有对齐。我应该修改什么设置? x轴未对齐 下面是我到目前为止在代码中使用的。setLabelsToSkip将无法工作,因为我使用的是3.0.1版。 这是我的标签格式化程序类: 以下是我的主要活动setdata方法: 在我的主要活动中,我像这样使用它: