Matplotlib:合并两个条形图

Matplotlib:合并两个条形图,matplotlib,plot,bar-chart,labels,axis-labels,Matplotlib,Plot,Bar Chart,Labels,Axis Labels,我正在尝试生成类似于小提琴的条形图,但是我遇到了下面描述的几个困难 import numpy as np import matplotlib.pyplot as plt import matplotlib.gridspec as gridspec # init data label = ['aa', 'b', 'cc', 'd'] data1 = [5, 7, 6, 9] data2 = [7, 3, 6, 1] data1_minus = np.array(data1)*-1 gs = g

我正在尝试生成类似于小提琴的条形图,但是我遇到了下面描述的几个困难

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec

# init data
label = ['aa', 'b', 'cc', 'd']
data1 = [5, 7, 6, 9]
data2 = [7, 3, 6, 1]
data1_minus = np.array(data1)*-1

gs = gridspec.GridSpec(1, 2, top=0.95, bottom=0.07,)
fig = plt.figure(figsize=(7.5, 4.0))

# adding left bar chart
ax1 = fig.add_subplot(gs[0])
ax1.barh(pos, data1_minus)
ax1.yaxis.tick_right()
ax1.yaxis.set_label(label)

# adding right bar chart
ax2 = fig.add_subplot(gs[1], sharey=ax1)
ax2.barh(pos, data2)

  • 将“标签”添加为两个图表共享的标签时出现问题
  • 将标签居中放置在两个图之间(以及垂直放置在每个条的中心)
  • 只保留外部yaxis上的刻度(而不是标签将要放在的内部)

如果我正确理解了这个问题,我相信这些更改可以实现您的目标:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec

# init data
label = ['aa', 'b', 'cc', 'd']
data1 = [5, 7, 6, 9]
data2 = [7, 3, 6, 1]
data1_minus = np.array(data1)*-1

gs = gridspec.GridSpec(1, 2, top=0.95, bottom=0.07,)
fig = plt.figure(figsize=(7.5, 4.0))
pos = np.arange(4)

# adding left bar chart
ax1 = fig.add_subplot(gs[0])
ax1.barh(pos, data1_minus, align='center')

# set tick positions and labels appropriately
ax1.yaxis.tick_right()
ax1.set_yticks(pos)
ax1.set_yticklabels(label)
ax1.tick_params(axis='y', pad=15)

# adding right bar chart
ax2 = fig.add_subplot(gs[1], sharey=ax1)
ax2.barh(pos, data2, align='center')

# turn off the second axis tick labels without disturbing the originals
[lbl.set_visible(False) for lbl in ax2.get_yticklabels()]

plt.show()
这就产生了这个图:

至于保留实际的数字记号(如果需要的话),当轴共享(或成对)时,普通matplotlib接口将记号紧密地连接在一起。但是,axes_grid1 toolkit可以让您进行更多的控制,因此,如果您需要一些数字标记,可以用以下内容替换上面的整个
ax2
部分:

from mpl_toolkits.axes_grid1 import host_subplot

ax2 = host_subplot(gs[1], sharey=ax1)
ax2.barh(pos, data2, align='center')
par = ax2.twin()
par.set_xticklabels('')
par.set_yticks(pos)
par.set_yticklabels([str(x) for x in pos])

[lbl.set_visible(False) for lbl in ax2.get_yticklabels()]

这就产生了:

关于你的第一点,你指的是什么标签?x轴的一个?对于标签,您可以尝试使用记号格式化程序来确保它们始终具有相同的长度。我不明白你的第三点,太好了!非常感谢您调查此事!我几乎是在剩下最后一件事的时候得到的。。。y轴标签未在两个绘图之间居中。有可能吗?看起来它们是右对齐的,是否可以“居中”它们?您可以将
ha='center'
添加到
set\u yticklabels
调用中,这样就可以了。然后,你可能需要调整你的填充物,使它们精确地位于正确的位置。