Python Matplotlib:将一个大图拆分成几个 Sub-Graphs(子图)
Python Matplotlib: Splitting one Large Graph into several Sub-Graphs (Subplot)
简单地说,假设我有 2 个列表:
A -> 有名称列表 ['A','B','C','D','E','F', 'G','H']
B -> 具有值列表 [5,7,3,8,2,9,1,3]
A 将是 X-Axis 标签的名称,B 中的相应值将是图形的高度(即 Y-Axis )。
%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]
plt.bar(range(len(reso_values)), reso_values, align='center')
plt.xticks(range(len(reso_names)), list(reso_names), rotation='vertical')
plt.margins(0.075)
plt.xlabel('X-Axis')
plt.ylabel('Y-Axis')
plt.title('Graph', {'family' : 'Arial Black',
'weight' : 'bold',
'size' : 22})
plt.show()
此代码给出以下输出:
但是我希望它为每 2 个值创建子图。在这种情况下应该有 4 个子图:
- 第一个图表有 'A' 和 'B'
- 第二张图有 'C' 和 'D'
- 第三张图有 'E' 和 'F'
- 第四张图有 'G' 和 'H'
这种拆分应该是动态完成的(不是 4 个不同的循环,它应该根据输入的大小将图形分成 2 个单元,如果列表 A 有 10 个值,那么它应该给出 5 个子图)。
我想出了如何将图形分成两半,但我需要使用每个图形 N 的步骤来实现它(本例中的 N 为 2)。
我将图分成 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
个元素的列表 values
/names
直接拆分为包含 N
个元素的 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)
):
简单地说,假设我有 2 个列表:
A -> 有名称列表 ['A','B','C','D','E','F', 'G','H']
B -> 具有值列表 [5,7,3,8,2,9,1,3]
A 将是 X-Axis 标签的名称,B 中的相应值将是图形的高度(即 Y-Axis )。
%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]
plt.bar(range(len(reso_values)), reso_values, align='center')
plt.xticks(range(len(reso_names)), list(reso_names), rotation='vertical')
plt.margins(0.075)
plt.xlabel('X-Axis')
plt.ylabel('Y-Axis')
plt.title('Graph', {'family' : 'Arial Black',
'weight' : 'bold',
'size' : 22})
plt.show()
此代码给出以下输出:
但是我希望它为每 2 个值创建子图。在这种情况下应该有 4 个子图:
- 第一个图表有 'A' 和 'B'
- 第二张图有 'C' 和 'D'
- 第三张图有 'E' 和 'F'
- 第四张图有 'G' 和 'H'
这种拆分应该是动态完成的(不是 4 个不同的循环,它应该根据输入的大小将图形分成 2 个单元,如果列表 A 有 10 个值,那么它应该给出 5 个子图)。
我想出了如何将图形分成两半,但我需要使用每个图形 N 的步骤来实现它(本例中的 N 为 2)。
我将图分成 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
个元素的列表 values
/names
直接拆分为包含 N
个元素的 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)
):