Python 使用与绘图无关的附加值对绘图进行注释';s x和y轴

Python 使用与绘图无关的附加值对绘图进行注释';s x和y轴,python,pandas,dataframe,matplotlib,Python,Pandas,Dataframe,Matplotlib,我正在制作一个带有原始计数的熊猫条形图,但我想用这些计数的pct作为一个整体来注释这些条形图。我见过很多人使用ax.patches方法进行注释,但我的值与实际条形图的get\u高度无关 这是一些玩具数据。生成的绘图将是特定类型的单个计数。但是,我想在该特定条的上方添加注释,这些注释表示该特定类型的pct总计到该人名的所有类型 如果你需要更多的澄清,请告诉我 import pandas as pd import numpy as np import matplotlib.pyplot as plt

我正在制作一个带有原始计数的熊猫条形图,但我想用这些计数的pct作为一个整体来注释这些条形图。我见过很多人使用
ax.patches
方法进行注释,但我的值与实际条形图的
get\u高度
无关

这是一些玩具数据。生成的绘图将是特定类型的单个计数。但是,我想在该特定条的上方添加注释,这些注释表示该特定类型的pct总计到该人名的所有类型

如果你需要更多的澄清,请告诉我

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)


您可以使用旧的方法,通过条循环,使用高度来定位所需的任何文本。自matplotlib 3.4.0以来,还有一个新函数删除了大部分样板文件:

将熊猫作为pd导入
将numpy作为np导入
将matplotlib.pyplot作为plt导入
d={'ID':[1,1,1,2,2,3,3,3,4],
“姓名”:[“鲍勃”、“鲍勃”、“鲍勃”、“谢尔比”、“谢尔比”、“乔丹”、“乔丹”、“乔丹”、“杰夫”],
‘类型’:[‘类型1’、‘类型2’、‘类型4’、‘类型1’、‘类型6’、‘类型5’、‘类型8’、‘类型2’、无]}
df:pd.DataFrame=pd.DataFrame(data=d)
df_pivot:pd.DataFrame=df.pivot_表(index='type',columns=['name'],values='ID',aggfunc={'ID':np.sum})。fillna(0)
#创建特定类型行的合计百分比
df_pivot['bob_pct_total']:pd.Series=(df_pivot['bob']/df_pivot['bob'].sum()).mul(100).四舍五入(1)
df_pivot['shelby_pct_total']:pd.Series=(df_pivot['shelby']/df_pivot['shelby'].sum()).mul(100).四舍五入(1)
df_pivot['jordan_pct_total']:pd.系列=(df_pivot['jordan']/df_pivot['jordan'].sum()).mul(100).第1轮
图,ax=plt.子批次(图尺寸=(12,5))
列=['bob'、'jordan'、'shelby']
df_pivot.plot(kind='bar',y='bob','jordan','shelby'],rot=0,ax=ax)
对于酒吧,用拉链包装(ax.containers,['bob_pct_total','jordan_pct_total','shelby_pct_total']:
ax.bar_标签(如果val==0,则为条,标签=['',否则为df_pivot[col]]中val的{val})
plt.紧_布局()
plt.show()

PS:要跳过为第一个条添加标签,您可以尝试:

对于酒吧,用拉链包装(ax.containers,['bob\u pct\u total','jordan\u pct\u total','shelby\u pct\u total']:
标签=[''如果val==0,则为df_pivot[col]]中的val添加“{val}”
标签[0]=“0”
ax.bar\u标签(条,标签=标签)

您可以使用
get_height()
来计算位置,然后在那里写入另一个字符串。这非常好。我使用的是旧版本的Matplotlib。刚刚更新,这真的很有帮助。我总是发现Matplotlib中的注释非常麻烦和令人沮丧,但这是完美的!这可能有点小众,但如果我想省略酒吧组的一个注释,我该怎么做呢?由于容器包含6个艺术家,我需要为每个容器省略第一个艺术家。所以基本上,如果我想隐藏“type1”注释,我该如何继续?我想我可以手动将这些VAL设置为0,这样当它打印时,它只会使它们为空。是的,将该值设置为0可能是最简单的方法。