我正在尝试在 matplotlib 中复制以下图像,似乎 barh
是我唯一的选择。虽然看起来你不能堆叠 barh
图表所以我不知道该怎么做
如果你知道更好的 python 库来绘制这种东西,请告诉我。
这就是我一开始所能想到的:
import matplotlib.pyplot as plt; plt.rcdefaults()
import numpy as np
import matplotlib.pyplot as plt
people = ('A','B','C','D','E','F','G','H')
y_pos = np.arange(len(people))
bottomdata = 3 + 10 * np.random.rand(len(people))
topdata = 3 + 10 * np.random.rand(len(people))
fig = plt.figure(figsize=(10,8))
ax = fig.add_subplot(111)
ax.barh(y_pos, bottomdata,color='r',align='center')
ax.barh(y_pos, topdata,color='g',align='center')
ax.set_yticks(y_pos)
ax.set_yticklabels(people)
ax.set_xlabel('Distance')
plt.show()
然后我将不得不使用 ax.text
单独添加标签,这会很乏味。理想情况下,我只想指定要插入的部分的宽度,然后它会用我选择的字符串更新该部分的中心。外面的标签(例如 3800)我可以稍后添加自己,它主要是在条形部分本身上的标签,并以一种我遇到问题的很好的方式创建这个堆叠方法。你能以任何方式指定一个“距离”,即颜色跨度吗?
原文由 Griff 发布,翻译遵循 CC BY-SA 4.0 许可协议
编辑 2:用于更多异构数据。 (我已经离开了上述方法,因为我发现每个系列使用相同数量的记录更常见)
回答问题的两个部分:
a)
barh
返回它绘制的所有补丁的句柄容器。您可以使用补丁的坐标来帮助文本定位。b) 按照我之前提到的问题的 这 两个 答案(请参阅 Matplotlib 中的水平堆叠条形图),您可以通过设置“左”输入来水平堆叠条形图。
另外 c) 处理形状不太统一的数据。
下面是处理形状不太统一的数据的一种方法,即简单地独立处理每个段。
产生这样的图形,每个系列中存在不同数量的段。
请注意,这不是特别有效,因为每个段都使用对
ax.barh
的单独调用。可能有更有效的方法(例如,通过用零宽度段或 nan 值填充矩阵)但这可能是特定于问题的并且是一个不同的问题。编辑:更新以回答问题的两个部分。
您可以按照这些路线获得结果(注意:我使用的百分比与条形宽度无关,因为示例中的关系似乎不清楚):
有关堆叠水平条形图的一些想法,请参阅 Matplotlib 中的水平堆叠条形图。