Skip to main content
 首页 » 编程设计

python之如何使条形图居中以显示某一列的差异

2025年05月04日13findumars

条形图如何居中显示某列的差异?

我有以下条形图,使用 matplotlib 完成:

请注意条形图真的很糟糕。每个酒吧之间的区别真的不能被正确地看到。所以我想要的是使用红色条作为 y 轴的原点。这样,其他条将显示差异 (blue_bar(i) - redbar)。

换句话说,我希望 y 轴上红色条的值是绘图的 y 原点。

同样,换句话说,红色条是我的学术工作获得的准确性。我想绘制与我的比较/相关的其他文章结果。

我使用 paint.net 制作了下图来说明我想要什么。 非常感谢任何其他想法/建议。

附录:

我使用以下代码生成了第一个图形:

import numpy as np 
import random 
from matplotlib import pyplot as plt 
 
accuracies = [0.9630, 0.9597, 0.9563, 0.9533, 0.9527, 0.9480, 0.9477, 0.9472, 0.9472, 0.9466, 0.9452, 0.9452, 0.9442, 
              0.9440, 0.9434, 0.9420, 0.9407, 0.9407, 0.9391, 0.9377, 0.9185, 0.9268] 
 
sensitividades = [0.7680, 0.7200, 0.8173, 0.7569, 0.7406, 0.7354, 0.7746, 0.7344, 0.7067, 0.7410, 0.7370, 0.7321, 
                  0.7357] 
 
especificidades = [0.9827, 0.9733, 0.9816, 0.9807, 0.9789, 0.9724, 0.9764, 0.9801, 0.9751, 0.9521, 0.9487, 0.9694] 
 
accuracies = [x * 100 for x in accuracies] 
 
y = accuracies 
 
N = len(y) 
x = range(N) 
width = 1 / 1.1 
fig, ax = plt.subplots(1, 1) 
ax.grid(zorder=0) 
 
# Plot other articles 
ax.bar(x, y, width, color="blue", zorder=3) 
 
# Plot my work 
ax.bar(x[len(x) - 1] + 1, 95.30, width, color="red", zorder=3) 
 
plt.title('Accuracy of each article') 
plt.xlabel('Article') 
plt.ylabel('Accuracy') 
 
plt.savefig('foo.png') 
plt.show() 

请您参考如下方法:

您可以将 y 限制设置为更接近有趣的值:

import numpy as np 
import random 
from matplotlib import pyplot as plt 
 
accuracies = [0.9630, 0.9597, 0.9563, 0.9533, 0.9527, 0.9480, 0.9477, 0.9472, 0.9472, 0.9466, 0.9452, 0.9452, 0.9442, 
              0.9440, 0.9434, 0.9420, 0.9407, 0.9407, 0.9391, 0.9377, 0.9185, 0.9268] 
 
sensitividades = [0.7680, 0.7200, 0.8173, 0.7569, 0.7406, 0.7354, 0.7746, 0.7344, 0.7067, 0.7410, 0.7370, 0.7321, 
                  0.7357] 
 
especificidades = [0.9827, 0.9733, 0.9816, 0.9807, 0.9789, 0.9724, 0.9764, 0.9801, 0.9751, 0.9521, 0.9487, 0.9694] 
 
accuracies = [x * 100 for x in accuracies] 
 
my_acc = 95.30 
y = accuracies 
 
N = len(y) 
x = range(N) 
width = 1 / 1.1 
fig, ax = plt.subplots(1, 1) 
ax.grid(zorder=0) 
 
# Plot other articles 
ax.bar(x, y, width, color="blue", zorder=3) 
 
# Plot my work 
ax.bar(x[len(x) - 1] + 1, my_acc, width, color="red", zorder=3) 
 
plt.title('Accuracy of each article') 
plt.ylim(min(y) - 0.5, max(y) +0.5) 
plt.xlabel('Article') 
plt.ylabel('Accuracy') 
 
plt.savefig('foo2.png') 
plt.show() 

或者您可以将其绘制在零附近,您的结果就是新的原点(但您必须指出原点在图例中或其他地方移动了多少):

import numpy as np 
import random 
from matplotlib import pyplot as plt 
 
accuracies = [0.9630, 0.9597, 0.9563, 0.9533, 0.9527, 0.9480, 0.9477, 0.9472, 0.9472, 0.9466, 0.9452, 0.9452, 0.9442, 
              0.9440, 0.9434, 0.9420, 0.9407, 0.9407, 0.9391, 0.9377, 0.9185, 0.9268] 
 
sensitividades = [0.7680, 0.7200, 0.8173, 0.7569, 0.7406, 0.7354, 0.7746, 0.7344, 0.7067, 0.7410, 0.7370, 0.7321, 
                  0.7357] 
 
especificidades = [0.9827, 0.9733, 0.9816, 0.9807, 0.9789, 0.9724, 0.9764, 0.9801, 0.9751, 0.9521, 0.9487, 0.9694] 
 
accuracies = [x * 100 for x in accuracies] 
 
my_acc = 95.30 
y = np.asarray(accuracies) - my_acc 
 
N = len(y) 
x = range(N) 
width = 1 / 1.1 
fig, ax = plt.subplots(1, 1) 
ax.grid(zorder=0) 
 
# Plot other articles 
bars = ax.bar(x, y, width, color="blue", zorder=3) 
 
# Plot my work 
# ax.bar(x[len(x) - 1] + 1, my_acc, width, color="red", zorder=3) 
 
plt.title('Accuracy of each article') 
plt.yticks([0, -0.3, -1.3, -2.3, -3.3, 0.7, 1.7], [95.30, 95, 94, 93, 92, 96, 97]) 
plt.xlabel('Article') 
plt.ylabel('Accuracy') 
plt.ylim(min(y) - 0.5, max(y) + 0.7) 
 
 
def autolabel(rects): 
    for i in range(len(rects)): 
        rect = rects[i] 
        height = rect.get_height() 
        if (height >= 0): 
            ax.text(rect.get_x() + rect.get_width()/2., 
            0.3 + height,'[{}]'.format( i), ha='center', va='bottom',  
            fontsize=7.5) 
        if (height < 0): 
            ax.text(rect.get_x() + rect.get_width()/2., 
            height - 0.3,'[{}]'.format( i), ha='center', va='bottom',  
            fontsize=7.5) 
 
autolabel(bars) 
plt.savefig('foo.png') 
plt.show() 

当然,您自己的结果不会出现在第二个图中,因为它的高度为零。