如何在堆叠柱状图中隐藏小于n的标签并控制小数位数?
隐藏堆叠柱状图中低于阈值的百分比标签并控制小数位数
绘制百分比堆叠柱状图时,因数据量大会出现大量0%的标签,希望隐藏小于指定阈值(比如n%)的标签。目前已能通过列表推导式隐藏低于特定数值的标签,但不知道如何同时控制标签的小数位数(类似fmt='%.0f%%'的效果)。
原生成图表代码:
import numpy as np import pandas as pd import matplotlib.pyplot as plt data = np.random.rand(5,10) data = 10 + data*10 df = pd.DataFrame(data, columns=list('ABCDEFGHIJ')) ax = df.plot(kind='bar', stacked=True) for c in ax.containers: ax.bar_label(c, fmt='%.0f%%', label_type='center') ax.legend(bbox_to_anchor=(1.0, 1.0), loc='upper left')
已知的隐藏低于12的标签的代码:
ax = df.plot(kind='bar', stacked=True) for c in ax.containers: labels = [v if v > 12 else "" for v in c.datavalues] ax.bar_label(c, labels=labels, label_type="center") ax.legend(bbox_to_anchor=(1.0, 1.0), loc='upper left')
解决方案
可以在生成标签列表时,直接对符合阈值条件的数值做字符串格式化,以此控制小数位数,不符合条件的设为空字符串即可。
比如要隐藏小于5%的标签,同时保留1位小数,代码如下:
import numpy as np import pandas as pd import matplotlib.pyplot as plt data = np.random.rand(5,10) data = 10 + data*10 df = pd.DataFrame(data, columns=list('ABCDEFGHIJ')) ax = df.plot(kind='bar', stacked=True) threshold = 5 # 设定阈值,小于该值的标签隐藏 for c in ax.containers: # 对大于阈值的数值格式化,保留1位小数并加%符号,否则为空 labels = [f"{v:.1f}%" if v > threshold else "" for v in c.datavalues] ax.bar_label(c, labels=labels, label_type="center") ax.legend(bbox_to_anchor=(1.0, 1.0), loc='upper left') plt.tight_layout() plt.show()
如果需要保留0位小数,只需把格式化字符串改成f"{v:.0f}%"即可,和原来的fmt='%.0f%%'效果完全一致。
内容的提问来源于stack exchange,提问作者ignotus
相关产品推荐
相关产品推荐

