我需要为一些likert数据制作一个发散条形图。我用的是熊猫,但如果没有熊猫的话,方法可能会相似。关键机制是在开始时添加一个不可见的缓冲区。在likert_colors = ['white', 'firebrick','lightcoral','gainsboro','cornflowerblue', 'darkblue']
dummy = pd.DataFrame([[1,2,3,4, 5], [5,6,7,8, 5], [10, 4, 2, 10, 5]],
columns=["SD", "D", "N", "A", "SA"],
index=["Key 1", "Key B", "Key III"])
middles = dummy[["SD", "D"]].sum(axis=1)+dummy["N"]*.5
longest = middles.max()
complete_longest = dummy.sum(axis=1).max()
dummy.insert(0, '', (middles - longest).abs())
dummy.plot.barh(stacked=True, color=likert_colors, edgecolor='none', legend=False)
z = plt.axvline(longest, linestyle=' ', color='black', alpha=.5)
z.set_zorder(-1)
plt.xlim(0, complete_longest)
xvalues = range(0,complete_longest,10)
xlabels = [str(x-longest) for x in xvalues]
plt.xticks(xvalues, xlabels)
plt.show()
这种方法有许多局限性。首先,条形图不再有黑色轮廓,而图例将有一个额外的空白元素。我只是隐藏了图例(我想可能有一种方法可以只隐藏单个元素)。我不确定是否有一种方便的方法使这些条有一个轮廓,而不将轮廓添加到缓冲元素中。在
首先,我们建立一些颜色和虚拟数据。然后我们计算左边两列的宽度和最中间一列的一半(我知道分别是“SD”、“D”和“N”)。我找到最长的列,并使用它的宽度来计算其他列所需的差异。接下来,我将这个新的buffer列插入第一列的位置,标题为空(这让我觉得很恶心,让我告诉你)。为了更好地度量,我还根据[2]的建议在中间条的中间位置后面添加了一条垂直线(axvline)。最后,我通过偏移x轴的标签来调整x轴,使其具有适当的比例。在
你可能想要更多的水平空间在左边-你可以很容易地这样做添加到“最长”。在
[2]海伯格、理查德·M.和纳奥米·B·罗宾斯。”利克特量表和其他应用的发散堆积条形图设计〉,《统计软件杂志》57.5(2014):1-32。在