python - 如何拆分 y 轴标签并分别为每个部分着色?
问题描述
ax.yaxis.get_major_ticks()
允许我对每个标签进行不同的颜色编码。但是我没有拆分标签并用不同的颜色标记每个部分。
示例图像:A_B =>蓝色中的 A和红色中的_B,类似地C_D =>蓝色中的C和红色中的D等。
虽然循环遍历文本可用的所有刻度get_text()
,但无法单独对每个部分进行颜色编码。
这是水平堆叠条形图的示例图形表示:
解决方案
借用这篇优秀文章中的一些代码,可以通过偏移框将文本放在一起。
import matplotlib.pyplot as plt
from matplotlib.offsetbox import AnchoredOffsetbox, TextArea, HPacker
fig, ax = plt.subplots()
vals1 = [0.3, 0.5, 0.4, 0.2, 0.5]
vals2 = [0.2, 0.3, 0.2, 0.2, 0.1]
labels1 = ['A', 'B', 'CCCC', 'DDDDDD', 'E']
labels2 = ['B', 'CCCC', 'DDDDDD', 'E', 'F']
color1 = 'dodgerblue'
color2 = 'crimson'
ax.barh(range(len(vals1)), vals1, color=color1)
ax.barh(range(len(vals2)), vals2, left=vals1, color=color2)
ax.set_yticklabels([])
for i in range(len(labels1)):
boxes = [TextArea(text, textprops=dict(color=color))
for text, color in zip([labels1[i], '_', labels2[i]], [color1, 'black', color2])]
xbox = HPacker(children=boxes, align="right", pad=1, sep=1)
anchored_xbox = AnchoredOffsetbox(loc='center right', child=xbox, pad=0, frameon=False, bbox_to_anchor=(0, i),
bbox_transform=ax.transData, borderpad=1)
ax.add_artist(anchored_xbox)
plt.tight_layout()
plt.show()
推荐阅读
- node.js - 在 AWS lambda node.js 中获取秘密
- javascript - 发送给除特定客户以外的所有客户
- http - 设置 Clear-Site-Data 标头时的预期行为?
- bash - 取消映射 bash 快捷键
- html - 如何使两个不同高度的图像在比例方面具有相同的高度?
- kubernetes - Kubernetes 部署滚动更新
- c# - Cosmos DB - BulkExecutor InitializeAsync 永远等待响应
- ios - 在 UITextField 中插入文本后不需要的 UIView 框架重置
- java - 我的 JFrame 不会变成我设置的大小
- reactjs - 如何从 Fire Store 中检索用户数据