如何使用 matplotlib 创建子图的大图?

Posted

技术标签:

【中文标题】如何使用 matplotlib 创建子图的大图?【英文标题】:How to use matplotlib to create a large graph of subplots? 【发布时间】:2017-10-20 23:31:43 【问题描述】:

我在遍历每个子图时遇到问题。我到达了子图的坐标,然后希望不同的模型出现在每个子图上。但是,我当前的解决方案循环遍历所有子图,但在每个子图中都循环遍历所有模型,最后一个模型在每个子图中绘制,这意味着它们看起来都一样。

我的目标是在每个子图上放置一个模型。请帮忙!

modelInfo = csv_info(filename) # obtains information from csv file
f, axarr = plt.subplots(4, 6)
for i in range(4):
    for j in range(6):
        for model in modelInfo:
            lat = dictionary[str(model) + "lat"]
            lon = dictionary[str(model) + "lon"]
            lat2 = dictionary[str(model) + "lat2"]
            lon2 = dictionary[str(model) + "lon2"]
            axarr[i, j].plot(lon, lat, marker = 'o', color = 'blue')
            axarr[i, j].plot(lon2, lat2, marker = '.', color = 'red')
            axarr[i, j].set_title(model)

【问题讨论】:

【参考方案1】:

您可以zip 您的模型和轴一起使用,并同时在两者上循环。但是,由于您的子图以2d array 的形式出现,因此您首先必须“线性化”其元素。您可以通过对numpy 数组使用reshape 方法轻松地做到这一点。如果您为该方法提供值-1,它会将数组转换为1d 向量。由于缺少您的输入数据,我使用来自numpy 的数学函数做了一个示例。有趣的getattr 行只是为了让我能够轻松地为情节添加标题:

from matplotlib import pyplot as plt
import numpy as np

modelInfo = ['sin', 'cos', 'tan', 'exp', 'log', 'sqrt']

f, axarr = plt.subplots(2,3)


x = np.linspace(0,1,100)
for model, ax in zip(modelInfo, axarr.reshape(-1)):
    func = getattr(np, model)
    ax.plot(x,func(x))
    ax.set_title(model)

f.tight_layout()
plt.show()

结果如下所示: .

请注意,如果您的模型数量超过可用subplots 的数量,多余的模型将被忽略且不会出现错误消息。

希望这会有所帮助。

【讨论】:

不错!比我一直做的好多了! @GergesDib 你的也能完成这项工作,这是最重要的部分;)【参考方案2】:

我认为这就是您正在寻找的,只要len(modelInfo) 小于6x4=24

modelInfo = csv_info(filename) # obtains information from csv file
f, axarr = plt.subplots(4, 6)

for n, model in enumerate(modelInfo):
    i = int(n/4)
    j = n % 6 
    lat = dictionary[str(model) + "lat"]
    lon = dictionary[str(model) + "lon"]
    lat2 = dictionary[str(model) + "lat2"]
    lon2 = dictionary[str(model) + "lon2"]
    axarr[i, j].plot(lon, lat, marker = 'o', color = 'blue')
    axarr[i, j].plot(lon2, lat2, marker = '.', color = 'red')
    axarr[i, j].set_title(model)

【讨论】:

以上是关于如何使用 matplotlib 创建子图的大图?的主要内容,如果未能解决你的问题,请参考以下文章

matplotlib 基础

如何仅使用 css 为垂直导航栏创建子菜单

使用 pandas 数据透视表创建子图

如何在couchbase服务器中正确创建子查询的索引?

CSS/JQuery:如何为表格行创建子菜单,使鼠标从行到菜单保持可见?

Matplotlib笔记 · 绘图区域的结构和子图布局与划分(figure, axes, subplots)