如何在Python Plotly Express中为每个堆叠条形图添加独立标题
问题
我有如下DataFrame:
import pandas as pd ppp2 = pd.DataFrame({'cluster_cj': {0: 'A', 1: 'A', 2: 'A', 3: 'A', 4: 'A', 5: 'A', 6: 'A', 7: 'A', 8: 'A', 9: 'A', 10: 'A', 11: 'A', 12: 'A', 13: 'C', 14: 'C', 15: 'C', 16: 'C', 17: 'C', 18: 'C', 19: 'C', 20: 'C', 21: 'C', 22: 'C', 23: 'C', 24: 'C', 25: 'C', 26: 'H', 27: 'H', 28: 'H', 29: 'H', 30: 'H', 31: 'H', 32: 'H', 33: 'H', 34: 'H', 35: 'H', 36: 'H', 37: 'H', 38: 'H', 39: 'H', 40: 'H', 41: 'H', 42: 'M', 43: 'M', 44: 'M', 45: 'M', 46: 'M', 47: 'M', 48: 'M', 49: 'M', 50: 'M', 51: 'M', 52: 'S', 53: 'S', 54: 'S', 55: 'S', 56: 'S', 57: 'S', 58: 'S', 59: 'S', 60: 'S', 61: 'S', 62: 'S', 63: 'S'}, 'cluster': {0: 'A', 1: 'A', 2: 'A', 3: 'A', 4: 'C', 5: 'C', 6: 'H', 7: 'H', 8: 'H', 9: 'H', 10: 'M', 11: 'M', 12: 'S', 13: 'A', 14: 'A', 15: 'C', 16: 'C', 17: 'C', 18: 'C', 19: 'H', 20: 'H', 21: 'H', 22: 'M', 23: 'M', 24: 'M', 25: 'M', 26: 'A', 27: 'A', 28: 'C', 29: 'C', 30: 'C', 31: 'C', 32: 'H', 33: 'H', 34: 'H', 35: 'H', 36: 'M', 37: 'M', 38: 'M', 39: 'M', 40: 'S', 41: 'S', 42: 'C', 43: 'C', 44: 'C', 45: 'C', 46: 'H', 47: 'M', 48: 'M', 49: 'M', 50: 'M', 51: 'S', 52: 'C', 53: 'H', 54: 'H', 55: 'H', 56: 'M', 57: 'M', 58: 'M', 59: 'M', 60: 'S', 61: 'S', 62: 'S', 63: 'S'}, 'cluster_confidence_label': {0: 'confident', 1: 'confused', 2: 'low', 3: 'moderate', 4: 'confident', 5: 'confused', 6: 'confident', 7: 'confused', 8: 'low', 9: 'moderate', 10: 'confused', 11: 'low', 12: 'moderate', 13: 'low', 14: 'moderate', 15: 'confident', 16: 'confused', 17: 'low', 18: 'moderate', 19: 'confident', 20: 'low', 21: 'moderate', 22: 'confident', 23: 'confused', 24: 'low', 25: 'moderate', 26: 'confident', 27: 'moderate', 28: 'confident', 29: 'confused', 30: 'low', 31: 'moderate', 32: 'confident', 33: 'confused', 34: 'low', 35: 'moderate', 36: 'confident', 37: 'confused', 38: 'low', 39: 'moderate', 40: 'confident', 41: 'confused', 42: 'confident', 43: 'confused', 44: 'low', 45: 'moderate', 46: 'moderate', 47: 'confident', 48: 'confused', 49: 'low', 50: 'moderate', 51: 'confused', 52: 'confused', 53: 'confident', 54: 'confused', 55: 'moderate', 56: 'confident', 57: 'confused', 58: 'low', 59: 'moderate', 60: 'confident', 61: 'confused', 62: 'low', 63: 'moderate'}, '%': {0: 24.0, 1: 18.0, 2: 24.0, 3: 34.0, 4: 50.0, 5: 50.0, 6: 21.4, 7: 21.4, 8: 14.3, 9: 42.9, 10: 83.3, 11: 16.7, 12: 100.0, 13: 66.7, 14: 33.3, 15: 42.1, 16: 12.4, 17: 8.9, 18: 36.7, 19: 35.7, 20: 21.4, 21: 42.9, 22: 17.8, 23: 36.0, 24: 14.0, 25: 32.2, 26: 50.0, 27: 50.0, 28: 31.2, 29: 35.4, 30: 20.8, 31: 12.5, 32: 39.5, 33: 20.2, 34: 14.7, 35: 25.6, 36: 17.9, 37: 7.7, 38: 30.8, 39: 43.6, 40: 60.0, 41: 40.0, 42: 7.4, 43: 55.6, 44: 11.1, 45: 25.9, 46: 100.0, 47: 25.6, 48: 29.8, 49: 19.3, 50: 25.4, 51: 100.0, 52: 100.0, 53: 42.9, 54: 23.8, 55: 33.3, 56: 20.9, 57: 41.8, 58: 24.2, 59: 13.2, 60: 44.2, 61: 30.8, 62: 3.8, 63: 21.2}, '%_all': {0: 43.9, 1: 43.9, 2: 43.9, 3: 43.9, 4: 5.3, 5: 5.3, 6: 12.3, 7: 12.3, 8: 12.3, 9: 12.3, 10: 36.8, 11: 36.8, 12: 1.8, 13: 1.8, 14: 1.8, 15: 52.2, 16: 52.2, 17: 52.2, 18: 52.2, 19: 2.8, 20: 2.8, 21: 2.8, 22: 43.1, 23: 43.1, 24: 43.1, 25: 43.1, 26: 5.2, 27: 5.2, 28: 20.6, 29: 20.6, 30: 20.6, 31: 20.6, 32: 55.4, 33: 55.4, 34: 55.4, 35: 55.4, 36: 16.7, 37: 16.7, 38: 16.7, 39: 16.7, 40: 2.1, 41: 2.1, 42: 4.8, 43: 4.8, 44: 4.8, 45: 4.8, 46: 1.2, 47: 93.1, 48: 93.1, 49: 93.1, 50: 93.1, 51: 0.9, 52: 1.2, 53: 12.7, 54: 12.7, 55: 12.7, 56: 54.8, 57: 54.8, 58: 54.8, 59: 54.8, 60: 31.3, 61: 31.3, 62: 31.3, 63: 31.3}})
我使用以下代码创建堆叠条形图:
import plotly_express as px fig = px.bar(ppp2.reset_index(), x='cluster_cj', color='cluster_confidence_label', y='%', facet_row='cluster', color_discrete_map={'confident': '#104E8B', 'moderate': '#1874CD', 'low': '#1C86EE', 'confused': '#1E90FF'}, category_orders={'cluster_confidence_label': ['confident','moderate','low','confused']}, text=ppp2['%'], custom_data=['%_all'] ) fig.for_each_annotation(lambda a: a.update(text=a.text.split("=")[-1])) fig.show()
生成的是按cluster分面的堆叠条形图,我希望在每个堆叠条形的上方添加标题,内容为DataFrame中对应的%_all列值,请问能否借助custom_data实现?或者有其他解决思路?
解决方案
思路说明
custom_data主要用于存储hover时的额外数据,直接用它添加顶部文本并不方便。更直接的方法是先提取每个分面(cluster)和x轴类别(cluster_cj)对应的唯一%_all值,再通过标注功能给每个条形顶部添加文本。
具体代码
import pandas as pd import plotly_express as px # 初始化DataFrame ppp2 = pd.DataFrame({'cluster_cj': {0: 'A', 1: 'A', 2: 'A', 3: 'A', 4: 'A', 5: 'A', 6: 'A', 7: 'A', 8: 'A', 9: 'A', 10: 'A', 11: 'A', 12: 'A', 13: 'C', 14: 'C', 15: 'C', 16: 'C', 17: 'C', 18: 'C', 19: 'C', 20: 'C', 21: 'C', 22: 'C', 23: 'C', 24: 'C', 25: 'C', 26: 'H', 27: 'H', 28: 'H', 29: 'H', 30: 'H', 31: 'H', 32: 'H', 33: 'H', 34: 'H', 35: 'H', 36: 'H', 37: 'H', 38: 'H', 39: 'H', 40: 'H', 41: 'H', 42: 'M', 43: 'M', 44: 'M', 45: 'M', 46: 'M', 47: 'M', 48: 'M', 49: 'M', 50: 'M', 51: 'M', 52: 'S', 53: 'S', 54: 'S', 55: 'S', 56: 'S', 57: 'S', 58: 'S', 59: 'S', 60: 'S', 61: 'S', 62: 'S', 63: 'S'}, 'cluster': {0: 'A', 1: 'A', 2: 'A', 3: 'A', 4: 'C', 5: 'C', 6: 'H', 7: 'H', 8: 'H', 9: 'H', 10: 'M', 11: 'M', 12: 'S', 13: 'A', 14: 'A', 15: 'C', 16: 'C', 17: 'C', 18: 'C', 19: 'H', 20: 'H', 21: 'H', 22: 'M', 23: 'M', 24: 'M', 25: 'M', 26: 'A', 27: 'A', 28: 'C', 29: 'C', 30: 'C', 31: 'C', 32: 'H', 33: 'H', 34: 'H', 35: 'H', 36: 'M', 37: 'M', 38: 'M', 39: 'M', 40: 'S', 41: 'S', 42: 'C', 43: 'C', 44: 'C', 45: 'C', 46: 'H', 47: 'M', 48: 'M', 49: 'M', 50: 'M', 51: 'S', 52: 'C', 53: 'H', 54: 'H', 55: 'H', 56: 'M', 57: 'M', 58: 'M', 59: 'M', 60: 'S', 61: 'S', 62: 'S', 63: 'S'}, 'cluster_confidence_label': {0: 'confident', 1: 'confused', 2: 'low', 3: 'moderate', 4: 'confident', 5: 'confused', 6: 'confident', 7: 'confused', 8: 'low', 9: 'moderate', 10: 'confused', 11: 'low', 12: 'moderate', 13: 'low', 14: 'moderate', 15: 'confident', 16: 'confused', 17: 'low', 18: 'moderate', 19: 'confident', 20: 'low', 21: 'moderate', 22: 'confident', 23: 'confused', 24: 'low', 25: 'moderate', 26: 'confident', 27: 'moder
相关产品推荐
相关产品推荐

