如何在多标签水平条形图中 hide/remove 标签没有数据

How to hide/remove labels with No Data in a multiple labeled horizontal Bar Chart

关注这个问题:。 我试图用水平条形图复制代码。我想知道如何 remove/hide 没有数据的标签。

所以不是这个:

看起来更像这样:

我附上下面的代码。

如果有人能在这里引导我朝着正确的方向前进,我将不胜感激。 提前谢谢你。

干杯

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

df = pd.DataFrame(
    {"DEPARTMENT": ["Accounting", "Administration", "Finance", "Finance", "Human resources", "IT", "Marketing", "R&D"], "DATE": ["June", "June", "July", "June", "June","June","June","June"], "COUNT": [10, 33, 16, 23, 3, 3, 5, 9]}
)

test=pd.pivot_table(df, values='COUNT', index='DATE',columns='DEPARTMENT',
            aggfunc=np.sum)

fig=plt.figure(dpi=300)
ax=test.plot(kind='barh',color=['#4472C4'], legend=False)
ax = plt.gca()
pos = []
for bar in ax.patches:
    pos.append(bar.get_y()+bar.get_height()/2.)

ax.set_yticks(pos,minor=True)
lab = []
for i in range(len(pos)):
    l = test.columns.values[i//len(test.index.values)]
    lab.append(l)

ax.set_yticklabels(lab,minor=True)
ax.tick_params(axis='y', which='major', pad=120, size=0)
plt.setp(ax.get_xticklabels(), rotation=0)

plt.show()
plt.close()

我编辑了您的代码,以在创建标签时检查每个单元格的值是否为 nan

如果单元格值为 nan 则标签值设置为空字符串,如果单元格值不是 nan 则使用真实标签。

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

df = pd.DataFrame(
    {"DEPARTMENT": ["Accounting", "Administration", "Finance", "Finance", "Human resources", "IT", "Marketing", "R&D"], "DATE": ["June", "June", "July", "June", "June","June","June","June"], "COUNT": [10, 33, 16, 23, 3, 3, 5, 9]}
)

test=pd.pivot_table(df, values='COUNT', index='DATE',columns='DEPARTMENT',
            aggfunc=np.sum)

fig=plt.figure(dpi=300)
ax=test.plot(kind='barh',color=['#4472C4'], legend=False)
ax = plt.gca()
pos = []
for bar in ax.patches:
    pos.append(bar.get_y()+bar.get_height()/2.)

ax.set_yticks(pos,minor=True)
lab = []

#EDITED FROM HERE
arr = []
for i in range(len(test.iloc[0].values)):
    arr.append(test.iloc[0].values[i])
    arr.append(test.iloc[1].values[i])

for i in range(len(pos)):
    l = test.columns.values[i//len(test.index.values)]
    val = arr[i]
    if np.isnan(val):
        lab.append("")
    else: 
        lab.append(l)
#TO HERE

ax.set_yticklabels(lab,minor=True)
ax.tick_params(axis='y', which='major', pad=120, size=0)
plt.setp(ax.get_xticklabels(), rotation=0)

plt.show()
plt.close()