matplotlib:子图外部的总体直方图

时间:2018-01-10 02:36:46

标签: python matplotlib histogram visualization

我想知道是否有办法在几个子图外部绘制直方图,这看起来像:

import numpy as np
import matplotlib.pyplot as plt

#some sample data
x = np.arange(1000)
y1 = np.random.randn(1000)
y2 = np.random.randn(1000)
y3 = np.random.randn(1000)
y4 = np.random.randn(1000)
ylist = [y1, y2, y3, y4]

fig = plt.figure()

ax1 = plt.subplot2grid((3, 3), (1, 0))
ax1.plot(x, y1)
ax2 = plt.subplot2grid((3, 3), (1, 1))
ax2.plot(x, y2)
ax3 = plt.subplot2grid((3, 3), (2, 0))
ax3.plot(x, y3)
ax4 = plt.subplot2grid((3, 3), (2, 1))
ax4.plot(x, y4)
ax5 = plt.subplot2grid((3, 3), (0, 0), colspan=2)
ax5.hist(ylist)
ax6 = plt.subplot2grid((3, 3), (1, 2), rowspan=2)
ax6.hist(ylist,orientation='horizontal')

plt.show()

样品

我最大的挑战是我有10行10列的子图。如果我以上述方式制作地块,那么代码看起来会很长很可怕。对于相同的样本数据,目前生成子图的代码看起来像这样,这是我保持简单的方法。

f, axs = plt.subplots(2,2)
for i, ax in enumerate(f.axes):
    ax.plot(x, ylist[i])

感谢任何帮助。感谢。

1 个答案:

答案 0 :(得分:1)

您可以通过使用循环来减少重复代码来简化代码。像下面这样的东西应该是你做的:

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

#some sample data
x = np.arange(1000)
y1 = np.random.randn(1000)
y2 = np.random.randn(1000)
y3 = np.random.randn(1000)
y4 = np.random.randn(1000)
ylist = [[y1, y2], [y3, y4]]

fig = plt.figure()

Row, Col = 3, 3
for i in range(1, 3):
    for j in range(0, 2):
        ax = plt.subplot2grid((Row, Col), (i, j))
        ax.plot(x, ylist[i-1][j])

flat_list = list(itertools.chain.from_iterable(ylist))

ax2 = plt.subplot2grid((Row, Col), (0, 0), colspan=2)
ax2.hist(flat_list)
ax3 = plt.subplot2grid((Row, Col), (1, 2), rowspan=2)
ax3.hist(flat_list, orientation='horizontal')

plt.show()

由于您没有提供10 * 10的绘图数据,因此您可能需要稍微调整代码。但我认为这不应该太难。