在同一图表上绘制matplotlib图(中位数回归)和pandas boxplot

时间:2017-04-05 08:40:16

标签: python pandas matplotlib

我想绘制一个箱形图(pandas)和同一轴上的中位数回归。不幸的是,它没有按预期工作。既不

fig, ax = plt.subplots(ncols=1)
data.boxplot(xxx, ax=ax)
ax.plot(xreg, yreg)

,也不

fig, ax = plt.subplots(ncols=1)
bplot = data.boxplot(xxx, ax=ax)
bplot.plot(xreg, yreg)

似乎有效。 enter image description here

最后一种方法似乎工作得更好x不适合。可能是什么原因以及如何在两个轴上获得相同的比例?

fig, ax = plt.subplots(ncols=1)
ax1 = ax.twiny()
bplot = data.boxplot(xxx, ax=ax)
ax1.plot(xreg, yreg)

enter image description here

原因可能是轴的缩放:

ax.get_xlim()
(0.5, 4.5)

ax1.get_xlim()
(-4.0, 84.0)

如果我只绘制回归和没有箱线图的中位数,一切正常:

enter image description here

1 个答案:

答案 0 :(得分:3)

通过查看documentation of plt.boxplot,我们发现这些框默认位于索引位置0,1,2,...。因此,N个框的轴限制为[-0.5,N + 0.5]。

文档还告诉我们,可以使用positions参数更改框的位置。

使用这个参数,我们可以将框定位在沿x轴的任何位置,然后可能需要调整它们的宽度,如果它们的间距变得非常大或很小。

完整示例:

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0,70)
f = lambda x: 6*np.exp(-x/50.)

pos = [10, 40, 48, 64]
a = np.empty((100,len(pos)))
for i, p in enumerate(pos):
    a[:,i] = np.random.normal(loc=f(p), size=a.shape[0])

plt.boxplot(a, positions=pos, widths=5)
plt.plot(x, f(x))
plt.xlim(0,70)

plt.show()

enter image description here