当前位置: 首页 > 知识库问答 >
问题:

Matplotlib:组合两个柱状图

仲涵亮
2023-03-14

我试图生成‘小提琴’一样的条形图,但我运行在几个困难中描述了下面······

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)

  • 将“label”添加为要共享的两个图表的标签时遇到麻烦。
  • 使两幅图之间的标签居中(以及在每个条的垂直中心)
  • 只保留外部yaxis上的刻度(而不是标签要去的内部)

共有1个答案

蔚元明
2023-03-14

如果我正确地理解了这个问题,我相信这些更改可以达到您所期望的目的:

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工具包允许您进行更多的控制,因此如果您想要一些数字刻度,可以用下面的代码替换上面的整个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 则表示具体的类别值。 Matplotlib 提供了 函数来绘制柱状图,它可以应用在 MATLAB 样式以及面向对象的绘图方法中。当它与 axes 对象一起使用时,其语法格式如下: ax.bar(x, h

  • 我有以下数据: 现在,如果我打电话: 我将得到两个单独的直方图,每列一个。这不是我想要的。我想要的是使用这两列生成一个直方图,其中一列被解释为一个值,另一列被解释为该值的多次出现。我应该如何生成这样的直方图? 我试过: 但这会生成更多带有错误信息的(空)直方图。

  • 本文向大家介绍matplotlib bar()实现百分比堆积柱状图,包括了matplotlib bar()实现百分比堆积柱状图的使用技巧和注意事项,需要的朋友参考一下 使用matplotlib创建百分比堆积柱状图的思路与堆积柱状图类似,只不过bottom参数累计的不是数值而是百分比,因此,需要事先计算每组柱子的数值总和,进而求百分比。 未使用numpy版本 适用于少量数据,数据结构需要手动构造。

  • 问题内容: 我有两个像这样的数组: 我想结合这两个数组,使其不包含重复项,并保留其原始键。例如,输出应为: 我已经尝试过了,但是它正在更改其原始键: 有什么办法吗? 问题答案: 只需使用: 那应该解决。因为如果一个键出现多次(例如在您的示例中),则使用字符串键,因此一个键将覆盖具有相同名称的处理键。因为在您的情况下,它们两者都具有相同的值,但这无关紧要,并且还会删除重复项。 更新:我刚刚意识到,P

  • 寻找一种优雅的方式以特殊的方式合并两个散列数组: 如果名称关键字匹配,则结果必须包含< code>new_data的所有名称散列,仅包含< code>old_data的额外数据。 我的第一次尝试是这样的,但是它创建了一个额外的散列:

  • 问题内容: 我有两个数组,我想将这两个数组合并为一个数组。请查看以下详细信息: 第一个数组: 第二个数组: 我想要这个结果。有人知道该怎么做吗? 希望你理解这个问题。先感谢您。 问题答案: 已修正 (再次) 接受无限数量的输入数组,将所有子数组作为索引数组合并到一个容器中,然后返回结果。 编辑03/2014: 提高可读性和效率