灵活的方式添加子图到图和一个颜色条图

时间:2018-01-23 09:53:19

标签: python python-2.7 matplotlib

我已经尝试过并尝试搜索解决方案,但我似乎无法使其正常工作,所以这是我的问题:

我正在尝试创建一个脚本,我可以在其中设置图形的大小(即图中的子图的数量)。对于图中的子图,它应该总是N * 2网格结构(具有相同的尺寸)。在网格中,我想绘制一些线条(具有特定颜色)并在图的底部添加水平颜色条。我已尝试按照Matplotlib 2 Subplots, 1 Colorbar中提到的问题解决方案。这是我的解决方案:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib
import matplotlib.colors as colors
import matplotlib.cm as cmx
import random

lines = np.random.rand(100, 10)
fig, ax = plt.subplots(nrows=2,ncols=2, sharex=True)
ranks = np.linspace(0,len(lines[0,:]), len(lines[0,:]))
norm = matplotlib.colors.Normalize(
    vmin=np.min(ranks),
    vmax=np.max(ranks))

c_m = matplotlib.cm.cool
s_m = matplotlib.cm.ScalarMappable(cmap=c_m, norm=norm)
s_m.set_array([])


for line, rank in zip(xrange(0,len(lines[0,:])), ranks):

    try:
        no = random.randint(0,1)
        no2 =random.randint(0,1)
        im =ax[no,no2].plot(lines[:, line], c=s_m.to_rgba(rank))
    except IOError as error:
        print error

fig.subplots_adjust(bottom=0.2)
fig.colorbar(s_m, orientation='horizontal')
plt.show()

所以我的问题是:我如何制作一个基于网格的子图(用于线和散点图),我可以在底部水平添加一个颜色条以覆盖底部的两个子图?

2 个答案:

答案 0 :(得分:1)

您应该为ax函数提供colorbar参数,

fig.colorbar(s_m, ax = ax.flatten(), orientation='horizontal')

然后会产生

enter image description here

答案 1 :(得分:1)

所以我想出来了,ThomasKühn和ImportanceOfBeingErnest都帮助我看到错误:

首先,我将问题改为可复制,并使用mappable而不是ax [1,1]。一旦这样做,在我的问题中,我可以看到它实际上是如何直接转移到我所链接的问题。这是我的结果:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib
import matplotlib.colors as colors
import matplotlib.cm as cmx
import os
import random


fnames = np.random.rand(100, 10)
fig, ax = plt.subplots(nrows=2,ncols=2, sharex=True, figsize=(4,4))
parameters = np.linspace(0,len(fnames[0,:]), len(fnames[0,:]))

norm = matplotlib.colors.Normalize(
    vmin=np.min(parameters),
    vmax=np.max(parameters))

c_m = matplotlib.cm.cool
s_m = matplotlib.cm.ScalarMappable(cmap=c_m, norm=norm)
s_m.set_array([])

for filename, parameter in zip(xrange(0,len(fnames[0,:])), parameters):
    try:
        no = random.randint(0,1)
        no2 =random.randint(0,1)
        ax[no,no2].plot(fnames[:, filename], c=s_m.to_rgba(parameter))
    except IOError as error:
        print error
for ax1 in ax.flatten():
    ax1.set_xlabel('Y')
    ax1.set_ylabel('X')
plt.title('Title')
fig.subplots_adjust(bottom=0.2)
cbar_ax = fig.add_axes([0.13, 0.08, 0.74, 0.03])
cbar = fig.colorbar(s_m, cax=cbar_ax, orientation='horizontal')
cbar.set_label('Focus: ')
plt.show()

这给了这个情节。谢谢你的提示。您是否建议将网格结构从plt.subplots更改为AxesGrid,在mpl_toolkits.axes_grid1中找到?

enter image description here