在次要Y轴上绘制带有最后一项的条形图

时间:2020-09-25 00:38:46

标签: python-3.x matplotlib bar-chart

我正在使用以下代码生成此图:enter image description here 但是,我只希望data1和data 2(F列)的最后一个值使用第二个y轴,因为它们比以前的值高得多。有人知道我该怎么做吗?感谢您的帮助!

x_label = ['A', 'B', 'C', 'D', 'E', 'F']
x_pos = np.arange(len(x_label))
data1 = [1,3,2,5,8,67]
data2 = [1,3,2,5,12,45]

# Build the plot
fig, ax = plt.subplots()
fontsize = 14
ax.bar(x_pos, data1, align='center', alpha=0.5, ecolor='black',
       capsize=3, width=0.2, color='r', label='data1')
ax.bar(x_pos+0.2, data2, align='center', alpha=0.5, ecolor='black',
       capsize=3, width=0.2, color='b', label='data2')

ax.set_xticks(x_pos)
ax.set_xticklabels(x_label, fontsize=fontsize)
plt.grid()
plt.show()

1 个答案:

答案 0 :(得分:1)

您的问题找到两个解决方案:一个是具有不同限制的左右轴(下面的第一个代码)。第二个是使用对数标度。请注意,通常首选第二种解决方案。

解决方案1:次要轴(不是最好的)

import matplotlib.pyplot as plt
import numpy as np

x_label = ['A', 'B', 'C', 'D', 'E', 'F']
x_pos = np.arange(len(x_label))
data1 = [1,3,2,5,8,67]
data2 = [1,3,2,5,12,45]

# Build the plot
fig, ax = plt.subplots()
fontsize = 14

ax2 = ax.twinx()

# all but F
ax.bar(x_pos[:-1], data1[:-1], align='center', alpha=0.5, ecolor='black',
       capsize=3, width=0.2, color='r', label='data1')
ax.bar(x_pos[:-1]+0.2, data2[:-1], align='center', alpha=0.5, ecolor='black',
       capsize=3, width=0.2, color='b', label='data2')

# F
ax2.bar([x_pos[-1]], [data1[-1]], align='center', alpha=0.5, ecolor='black',
       capsize=3, width=0.2, color='r', label='data1')
ax2.bar([x_pos[-1]+0.2], [data2[-1]], align='center', alpha=0.5, ecolor='black',
       capsize=3, width=0.2, color='b', label='data2')

ax.set_xticks(x_pos)
ax.set_xticklabels(x_label, fontsize=fontsize)
plt.grid()
plt.show()

这将产生下面的图像。问题在于,除非更改颜色,否则我们无法分辨出哪些条属于右轴,但是在这种情况下,它不再与左条的颜色代码相对应。

bar with twins axis

解决方案2:使用对数刻度(更清洁)

import matplotlib.pyplot as plt
import numpy as np

x_label = ['A', 'B', 'C', 'D', 'E', 'F']
x_pos = np.arange(len(x_label))
data1 = [1,3,2,5,8,67]
data2 = [1,3,2,5,12,45]

# Build the plot
fig, ax = plt.subplots()
fontsize = 14

ax.bar(x_pos, data1, align='center', alpha=0.5, ecolor='black',
       capsize=3, width=0.2, color='r', label='data1')
ax.bar(x_pos+0.2, data2, align='center', alpha=0.5, ecolor='black',
       capsize=3, width=0.2, color='b', label='data2')

ax.set_xticks(x_pos)
ax.set_xticklabels(x_label, fontsize=fontsize)
ax.set_yscale('log')
plt.grid()
plt.show()

哪个在下面生成此图像。现在,每个条形图都显示在同一轴上,并带有对数刻度轴。动态范围大的数据通常以对数刻度显示。

bars with log scale