有没有一种方法可以在matplotlib中制作多个水平箱线图?

5
我正在尝试制作一个matplotlib图形,其中将有多个水平箱线图堆叠在一起。文档展示了如何制作单个水平箱线图以及如何制作多个垂直定向的图表在这个部分。我尝试使用子图,代码如下:
import numpy as np
import pylab as plt

totfigs = 5

plt.figure()
plt.hold = True

for i in np.arange(totfigs):    
    x = np.random.random(50)
    plt.subplot('{0}{1}{2}'.format(totfigs,1,i+1))
    plt.boxplot(x,vert=0)
plt.show()

我的输出结果只有一个水平箱形图。
有什么建议吗?
编辑:感谢@joaquin,我修复了plt.subplot调用行。现在子图版本可以工作了,但仍然希望将所有箱形图放在一个图中...

1
此代码在 plt.subplot 行产生了异常:IndexError: list index out of range - joaquin
谢谢@joaquin - 你是对的。我已经修复了它。现在我可以很好地使用subplot选项。不过,将图形放在单个图中而不是子图中仍然是不错的选择... - mishaF
2个回答

7

如果我理解正确,您只需要将包含要绘制的每个数组的列表(或2D数组)传递给boxplot。

import numpy as np
import pylab as plt

totfigs = 5

plt.figure()
plt.hold = True
boxes=[]
for i in np.arange(totfigs):    
    x = np.random.random(50)
    boxes.append(x)

plt.boxplot(boxes,vert=0)
plt.show()

enter image description here


没错!我没有意识到我可以先把它们变成列表。完美! - mishaF

1

尝试:

plt.subplot('{0}{1}{2}'.format(totfigs, 1, i+1)    # n rows, 1 column

或者

plt.subplot('{0}{1}{2}'.format(1, totfigs, i+1))    # 1 row, n columns

从文档字符串中:

subplot(*args, **kwargs)

创建一个子图命令,使用以下方式创建轴:

subplot(numRows, numCols, plotNum)

其中 plotNum = 1 是第一个绘图编号,递增的 plotNums 先填充行。max(plotNum) == numRows * numCols

如果您想将它们全部放在一起,可以方便地进行移动。以下是一个带有常量移位的示例:

for i in np.arange(totfigs):    
    x = np.random.random(50)
    plt.boxplot(x+(i*2),vert=0)

是的 - 我看到那是我的错误。但仍然没有解决避免使用子图的另一个愿望... - mishaF
@mishaF 最后一种选择根本不使用子图。 - joaquin
没错,但这些图是水平排列的。我希望有一组水平定向的箱线图垂直堆叠在彼此上面。换句话说,我需要一个垂直而不是水平的移位。 - mishaF
将vert=1更改其方向。Stephen上面发布的图片就是我所说的。抱歉我可能没有表达清楚。 - mishaF

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接