首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在单循环中使用子图对多个图形进行绘图

在单循环中使用子图对多个图形进行绘图
EN

Stack Overflow用户
提问于 2017-10-05 04:24:55
回答 2查看 9.1K关注 0票数 4

我在两个图上绘制,每个图都有多个子图。我需要在一个循环中完成这项工作。当我只有一个数字时,我会这样做:

代码语言:javascript
运行
复制
fig, ax = plt.subplots(nrows=6,ncols=6,figsize=(20, 20))
fig.subplots_adjust(hspace=.5,wspace=0.4)
plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=None, hspace=None)

for x in range(1,32):
    plt.subplot(6,6,x)
    plt.title('day='+str(x))
    plt.scatter(x1,y1)
    plt.scatter(x2,y2)
    plt.colorbar().set_label('Distance from ocean',rotation=270)
plt.savefig('Plots/everyday_D color.png')    
plt.close()

现在我知道当你有多个图形时,你需要这样做:

代码语言:javascript
运行
复制
fig1, ax1 = plt.subplots()
fig2, ax2 = plt.subplots()

但是我不知道如何在循环中绘图,每个子图都在它的位置上(因为如果有两个图形,你就不能一直做plt.scatter )。请具体说明我需要做什么(关于它是否是图1.散布,轴1.散布,fig.subplots_adjust,...以及如何在结束时保存和关闭)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-05 04:50:42

在面向对象的API中,每个pyplot函数都有其对应的方法。如果你真的想同时循环两个图形的轴,看起来就像这样:

代码语言:javascript
运行
复制
import numpy as np
import matplotlib.pyplot as plt

x1 = x2 = np.arange(10)
y1 = y2 = c = np.random.rand(10,6)

fig1, axes1 = plt.subplots(nrows=2,ncols=3)
fig1.subplots_adjust(hspace=.5,wspace=0.4)

fig2, axes2 = plt.subplots(nrows=2,ncols=3)
fig2.subplots_adjust(hspace=.5,wspace=0.4)

for i, (ax1,ax2) in enumerate(zip(axes1.flatten(), axes2.flatten())):
    ax1.set_title('day='+str(i))
    ax2.set_title('day='+str(i))
    sc1 = ax1.scatter(x1,y1[:,i], c=c[:,i])
    sc2 = ax2.scatter(x2,y2[:,i], c=c[:,i])
    fig1.colorbar(sc1, ax=ax1)
    fig2.colorbar(sc2, ax=ax2)

plt.savefig("plot.png") 
plt.show()   
plt.close()

在这里,您循环遍历两个平坦的轴数组,这样ax1ax2就是要绘制的matplotlib axesfig1fig2是matplotlib图形(matplotlib.figure.Figure)。

为了获得索引,还使用了enumerate。所以这条线

代码语言:javascript
运行
复制
for i, (ax1,ax2) in enumerate(zip(axes1.flatten(), axes2.flatten())):
    # loop code

在这里等同于

代码语言:javascript
运行
复制
for i in range(6):
    ax1 = axes1.flatten()[i]
    ax2 = axes2.flatten()[i]
    # loop code

代码语言:javascript
运行
复制
i = 0
for ax1,ax2 in zip(axes1.flatten(), axes2.flatten()):
    # loop code
    i += 1

它们都需要更长的时间来编写。

在这一点上,您可能会感兴趣的事实是,尽管使用面向对象的API的上述解决方案肯定更通用、更可取,但纯粹的pyplot解决方案仍然是可能的。这看起来就像

代码语言:javascript
运行
复制
import numpy as np
import matplotlib.pyplot as plt

x1 = x2 = np.arange(10)
y1 = y2 = c = np.random.rand(10,6)

plt.figure(1)
plt.subplots_adjust(hspace=.5,wspace=0.4)

plt.figure(2)
plt.subplots_adjust(hspace=.5,wspace=0.4)

for i in range(6):
    plt.figure(1)
    plt.subplot(2,3,i+1)
    sc1 = plt.scatter(x1,y1[:,i], c=c[:,i])
    plt.colorbar(sc1)

    plt.figure(2)
    plt.subplot(2,3,i+1)
    sc2 = plt.scatter(x1,y1[:,i], c=c[:,i])
    plt.colorbar(sc2)

plt.savefig("plot.png") 
plt.show()   
plt.close()
票数 4
EN

Stack Overflow用户

发布于 2017-10-05 05:03:05

这是一个展示如何在两个不同的图形上运行散点图的版本。基本上,您引用使用plt.subplots创建的轴。

代码语言:javascript
运行
复制
import matplotlib.pyplot as plt
import numpy as np

x1 = y1 = range(10)
x2 = y2 = range(5)

nRows = nCols = 6
fig1, axesArray1 = plt.subplots(nrows=nRows,ncols=nCols,figsize=(20, 20))
fig1.subplots_adjust(hspace=.5,wspace=0.4)
fig1.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=None, hspace=None)

fig2, axesArray2 = plt.subplots(nrows=nRows,ncols=nCols,figsize=(20, 20))
fig2.subplots_adjust(hspace=.5,wspace=0.4)
fig2.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=None, hspace=None)

days = range(1, 32)
dayRowCol = np.array([i + 1 for i in range(nRows * nCols)]).reshape(nRows, nCols)
for day in days:
    rowIdx, colIdx = np.argwhere(dayRowCol == day)[0]

    axis1 = axesArray1[rowIdx, colIdx]
    axis1.set_title('day=' + str(day))
    axis1.scatter(x1, y1)

    axis2 = axesArray2[rowIdx, colIdx]
    axis2.set_title('day=' + str(day))
    axis2.scatter(x2, y2)

    # This didn't run in the original script, so I left it as is
    # plt.colorbar().set_label('Distance from ocean',rotation=270)

fig1.savefig('plots/everyday_D1_color.png')
fig2.savefig('plots/everyday_D2_color.png')
plt.close('all')

当我从帖子中获取原始代码时,plt.colorbar()提出了一个错误,所以我在答案中省略了它。如果你有一个colorbar是如何工作的例子,我们可以看看如何在两个数字中实现,但其余的代码应该可以按预期工作!

请注意,如果numpy every没有出现在dayRolCol中,则会引发一个错误,您可以自行决定如何处理这种情况。此外,使用numpy绝对不是唯一的方法,只是一种我很习惯的方法--你真正需要做的就是找到一种方法,将某一天/图与你想要绘制的轴的(x,y)索引联系起来。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46573570

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档