Python Matplotlib:将一个大型图拆分为多个子图(子图)

Python Matplotlib:将一个大型图拆分为多个子图(子图),python,python-3.x,pandas,matplotlib,subplot,Python,Python 3.x,Pandas,Matplotlib,Subplot,简单地说,假设我有两个列表: A->具有名称列表['A'、'B'、'C'、'D'、'E'、'F'、'G'、'H'] B->具有值列表[5,7,3,8,2,9,1,3] A是X轴标签的名称,B中的相应值是图形的高度(即Y轴)。 此代码提供以下输出: 但是,我希望它每2个值生成一个子图。在这种情况下,应该有4个子图: 第一个图形有“A”和“B” 第二个图形有“C”和“D” 第三个图形有“E”和“F” 第四个图形有“G”和“H” 这种拆分应该动态进行(不是4个不同的循环,它应该根据输入的大小将图

简单地说,假设我有两个列表:
A->具有名称列表['A'、'B'、'C'、'D'、'E'、'F'、'G'、'H']
B->具有值列表[5,7,3,8,2,9,1,3]
A是X轴标签的名称,B中的相应值是图形的高度(即Y轴)。

此代码提供以下输出:

但是,我希望它每2个值生成一个子图。在这种情况下,应该有4个子图:

  • 第一个图形有“A”和“B”
  • 第二个图形有“C”和“D”
  • 第三个图形有“E”和“F”
  • 第四个图形有“G”和“H”
这种拆分应该动态进行(不是4个不同的循环,它应该根据输入的大小将图形拆分为2个单位,如果列表A有10个值,那么它应该给出5个子图)



我知道了如何将图拆分为两个,每个一半,但我需要使用每个图N的步骤来实现它(在本例中,N为2)。
我将图分解为两个相等的子图的代码是:

%matplotlib inline
import pandas as pd
from matplotlib import rcParams
import matplotlib.pyplot as plt
from operator import itemgetter

rcParams.update({'figure.autolayout': True})
plt.figure(figsize=(14,9), dpi=600)

reso_names = ['A','B','C','D','E','F','G','H']
reso_values = [5,7,3,8,2,9,1,3]

fig, axs = plt.subplots(nrows=2, sharey=True, figsize=(14,18), dpi=50)
size = int(len(reso_values))
half = int( size/2 )

fig.suptitle('Graph', 
          **{'family': 'Arial Black', 'size': 22, 'weight': 'bold'})

for ax, start, end in zip(axs, (0, half), (half, size)):
    names, values = list(reso_names[start:end]), reso_values[start:end]
    ax.bar(range(len(values)), values, align='center')
    ax.set_xlabel('X-Axis')
    ax.set_ylabel('Y-Axis')
    ax.set_xticks(range(len(names)))
    ax.set_xticklabels(names, rotation='vertical')
    ax.set_xlim(0, len(names))
fig.subplots_adjust(bottom=0.05, top=0.95)
plt.show()

这给了我:



我只想让程序根据拆分编号N动态地将图形拆分为子图。

您可以直接使用
size
元素将列表中的
/
名称
拆分为
size//N+1
元素列表,使用此代码:

N=3
sublists_names = [reso_names[x:x+N] for x in range(0, len(reso_names), N)]
sublists_values = [reso_values[x:x+N] for x in range(0, len(reso_values), N)]
请注意,如果N不划分大小,则最后一个子列表将包含较少的元素

然后,您只需执行压缩并在不同的图形中绘制每个子列表:

import pandas as pd
from matplotlib import rcParams
import matplotlib.pyplot as plt
from operator import itemgetter

rcParams.update({'figure.autolayout': True})
plt.figure(figsize=(14,9), dpi=600)

reso_names = ['A','B','C','D','E','F','G','H']
reso_values = [5,7,3,8,2,9,1,3]

N=3
sublists_names = [reso_names[x:x+N] for x in range(0, len(reso_names), N)]
sublists_values = [reso_values[x:x+N] for x in range(0, len(reso_values), N)]

size = int(len(reso_values))
fig, axs = plt.subplots(nrows=size//N+1, sharey=True, figsize=(14,18), dpi=50)

fig.suptitle('Graph', 
          **{'family': 'Arial Black', 'size': 22, 'weight': 'bold'})

for ax, names, values in zip(axs, sublists_names, sublists_values):
    ax.bar(range(len(values)), values, align='center')
    ax.set_xlabel('X-Axis')
    ax.set_ylabel('Y-Axis')
    ax.set_xticks(range(len(names)))
    ax.set_xticklabels(names, rotation='vertical')
    ax.set_xlim(0, len(names))
    #ax.set_xlim(0, N)

fig.subplots_adjust(bottom=0.05, top=0.95)
plt.show()

如果列表不能被N分割,您可以取消注释最后一个注释行,使条在最后一个子图上保持对齐:(
ax.set_xlim(0,N)
):


很难从您的描述和依赖外部数据的代码中了解您拥有什么和想要什么。你能发布一个它现在看起来像什么以及结果会是什么样子的表示吗?基本上我有150个值,所以我想让它有子图,每个子图一次显示30个。图一为0-29,图二为30-59,依此类推。与将所有150个值塞进一个不可读的图表不同。大部分内容被重新表述,使问题变得更简单。我试图针对我的问题定制此脚本,但我遇到了一些问题。我想要线图而不是条形图,我怎样才能做到这一点#Yann你能给我提个建议吗?
import pandas as pd
from matplotlib import rcParams
import matplotlib.pyplot as plt
from operator import itemgetter

rcParams.update({'figure.autolayout': True})
plt.figure(figsize=(14,9), dpi=600)

reso_names = ['A','B','C','D','E','F','G','H']
reso_values = [5,7,3,8,2,9,1,3]

N=3
sublists_names = [reso_names[x:x+N] for x in range(0, len(reso_names), N)]
sublists_values = [reso_values[x:x+N] for x in range(0, len(reso_values), N)]

size = int(len(reso_values))
fig, axs = plt.subplots(nrows=size//N+1, sharey=True, figsize=(14,18), dpi=50)

fig.suptitle('Graph', 
          **{'family': 'Arial Black', 'size': 22, 'weight': 'bold'})

for ax, names, values in zip(axs, sublists_names, sublists_values):
    ax.bar(range(len(values)), values, align='center')
    ax.set_xlabel('X-Axis')
    ax.set_ylabel('Y-Axis')
    ax.set_xticks(range(len(names)))
    ax.set_xticklabels(names, rotation='vertical')
    ax.set_xlim(0, len(names))
    #ax.set_xlim(0, N)

fig.subplots_adjust(bottom=0.05, top=0.95)
plt.show()