将子图划分到多个屏幕上

时间:2019-05-31 04:37:55

标签: python-3.x matplotlib graph

我想使用dataframe从csv文件中绘制一些数据。

我的代码当前显示266 = 14 * 19个单独的子图。当前,它被编码为在一个屏幕上显示所有266个子图,每个子图很小且难以阅读。

我尝试使用1x1的情节

#fig, cx=plt.subplots(1,1, sharex=False, sharey=False, figsize=(18,12))

主要代码:

fig, cx=plt.subplots(14,19, sharex=False, sharey=False, figsize=(18,12))
#fig, cx=plt.subplots(1,1, sharex=False, sharey=False, figsize=(18,12))

plt.subplots_adjust(hspace=0.5)

cx = cx.ravel()

for i in range(0,len(Bond)):
    cx[i].plot(VelLog[Bond[i]], color='b')
    cx[i].set_xlabel('Time (ms)')
    cx[i].set_ylabel('Velocity (m/s)')
    cx[i].set_ylim(-250,150)
    cx[i].set_title(Bond[i])

plt.savefig('Velocity.png', dpi=120)
plt.show()
##################################
Error message when I un-comment Line 1
cx[i].plot(VelLog[Bond[i]], color='b')
IndexError: index 209 is out of bounds for axis 0 with size 209

如何一次只在屏幕上显示几个子图以提高可读性?

像5x5 + 5x5 + 5x5 + 5x5 + 5x5,+ 5x5 + 5x5 + 5x5 + 5x5 + 5x5 + 4x4 = 266

11个不同的屏幕。

是否可以添加图表过滤器作为替代?

这是我更新的代码,其中包含您的建议。现在它会创建11个数字。我能够绘制所有266张图,但每个图看起来都一样

Nrows, Ncols = 14, 19
Nplots = Nrows*Ncols

nrows, ncols = 5, 5
naxes = nrows*ncols

nfigures = Nplots//naxes

count = 0
figures = []

for fignum in range(nfigures+1):
    fig, axes = plt.subplots(nrows, ncols,  sharex=False, sharey=False, figsize=(18,12))
    plt.subplots_adjust(hspace=0.5)
    #axes = axes.ravel()
    figures.append(fig)
    axes = axes.flat
    for ax in axes:
        #print(count)
        if count<Nplots:
            for i in range(0,len(Bond)):
                cvs_row, cvs_col = divmod(count, Ncols)
                cvs_row, cvs_col = cvs_row+1, cvs_col+1
                ax.plot(VelLog[Bond[i]], color='b', label='%d,%d'%(cvs_row, cvs_col))
                ax.set_xlabel('Time (ms)')
                ax.set_ylabel('Velocity (m/s)')
                ax.set_ylim(-250,150)
                ax.set_title(Bond[i])
            count = count+1

plt.savefig('Velocity.png', dpi=120)
plt.show()

这是一个数字的结果 enter image description here

1 个答案:

答案 0 :(得分:0)

在这里,我绘制相同的函数14 * 19次,但是您可以了解一下

我们有两个问题,跟踪我们正在绘制的内容和 延迟实际绘图,直到我们完成所有绘图为止。

这里使用全局计数器和divmod解决了第一个问题 内置,第二个将所有图形存储在列表中并调用 plt.show()仅在绘图阶段的最后。

为了显示“跟踪”的含义,我添加了标签和 每个子图的图例。

为了使事情更合理,我不检查最后一个数字是否为空 而且我也不检查最后一个数字的某些子图是否为空, 但请记住,如果您可以从图形中删除一些子图 想要一个干净的最后一个数字。

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, np.pi, 31)
y = np.sin(x)

Nrows, Ncols = 14, 19
Nplots = Nrows*Ncols

nrows, ncols = 5, 5
naxes = nrows*ncols

nfigures = Nplots//naxes

count = 0
figures = []

for fignum in range(nfigures+1):
    fig, axes = plt.subplots(nrows, ncols)
    figures.append(fig)
    axes = axes.flat
    for ax in axes:
        print(count)
        if count<Nplots:
            cvs_row, cvs_col = divmod(count, Ncols)
            cvs_row, cvs_col = cvs_row+1, cvs_col+1
            ax.plot(x, y, label='%d,%d'%(cvs_row, cvs_col))
            ax.legend()
            count = count+1

plt.show()

这里我仅显示最后一个数字,以显示“空”的含义 子图“ ...

enter image description here