如何在多标签水平条形图中 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()
关注这个问题:
所以不是这个:
看起来更像这样:
我附上下面的代码。
如果有人能在这里引导我朝着正确的方向前进,我将不胜感激。 提前谢谢你。
干杯
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()