Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在matplotlib中创建分组箱线图_Python_Matplotlib - Fatal编程技术网

Python 如何在matplotlib中创建分组箱线图

Python 如何在matplotlib中创建分组箱线图,python,matplotlib,Python,Matplotlib,我有三种算法,A、B和C。我在不同的数据集上运行过它们,并希望在Python中将它们的运行时绘制为分组的箱线图 作为我想要的一个直观的例子,我画了一幅很糟糕的画,但希望它能让我明白这一点 如果我的python数据如下所示: import numpy as np import random data = {} data['dataset1'] = {} data['dataset2'] = {} data['dataset3'] = {} n = 5 for k,v in data.iter

我有三种算法,A、B和C。我在不同的数据集上运行过它们,并希望在Python中将它们的运行时绘制为分组的箱线图

作为我想要的一个直观的例子,我画了一幅很糟糕的画,但希望它能让我明白这一点

如果我的python数据如下所示:

import numpy as np
import random

data = {}
data['dataset1'] = {}
data['dataset2'] = {}
data['dataset3'] = {}

n = 5
for k,v in data.iteritems():
    upper = random.randint(0, 1000)
    v['A'] = np.random.uniform(0, upper, size=n)
    v['B'] = np.random.uniform(0, upper, size=n)
    v['C'] = np.random.uniform(0, upper, size=n)

如何使我的绘图看起来像我画的图片?

使用独立的子绘图最容易做到这一点:

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

data = {}
data['dataset1'] = {}
data['dataset2'] = {}
data['dataset3'] = {}

n = 500
for k,v in data.iteritems():
    upper = random.randint(0, 1000)
    v['A'] = np.random.uniform(0, upper, size=n)
    v['B'] = np.random.uniform(0, upper, size=n)
    v['C'] = np.random.uniform(0, upper, size=n)

fig, axes = plt.subplots(ncols=3, sharey=True)
fig.subplots_adjust(wspace=0)

for ax, name in zip(axes, ['dataset1', 'dataset2', 'dataset3']):
    ax.boxplot([data[name][item] for item in ['A', 'B', 'C']])
    ax.set(xticklabels=['A', 'B', 'C'], xlabel=name)
    ax.margins(0.05) # Optional

plt.show()

完全符合我的要求!谢谢总是惊讶于python中matplotlib的多功能性。@lollercoaster-很乐意帮忙!你的草图和示例数据使你的问题非常清楚,很容易回答,不管它值多少钱。好问题@JoeKington你是如何去掉2号和3号地块上的
yticklabels
?对于我来说,它们出现在所有三个绘图中,如果我从其中一个绘图中删除它们,它们将从所有三个绘图中消失,因为
yaxis
是共享的。@Deditos-使用
subplot
sharey=True
应该自动隐藏它们,但如果不是出于某种原因,请使用
plt.setp(ax2.get\ytickbels(),visible=False)
(对于
ax3
)重复上述步骤。您遇到的是一个具有共享轴的经典问题。
plt.setp(…,visible=False)
是一种变通方法,因此它们仍然显示在第一个轴上,但不显示在其他共享轴上。@JoeKington:可能是因为我使用的是旧的matplotlib版本,但是手动
setp
命令起到了作用,谢谢!如果定期使用箱线图,请查看哪一个添加了更灵活的界面。可能重复属于