304

私は、Matplotlib で 2 つのサブプロットが同じ y 軸を共有し、1 つのカラーバーが 2 つの間で共有されるようにする方法を研究するのに非常に長い時間を費やしました。

何が起こっていたのかというと、またはのいずれかでcolorbar()関数を呼び出すと、カラーバーとプロットが「サブプロット」境界ボックス内に収まるようにプロットが自動スケーリングされ、2 つの横に並んだプロットが 2 つの非常に異なるものになるということでした。サイズ。subplot1subplot2

これを回避するために、3 番目のサブプロットを作成しようとしましたが、それをハッキングして、カラーバーだけでプロットをレンダリングしませんでした。唯一の問題は、2 つのプロットの高さと幅が不均一になっていることです。どうすれば見栄えがよくなるかわかりません。

これが私のコードです:

from __future__ import division
import matplotlib.pyplot as plt
import numpy as np
from matplotlib import patches
from matplotlib.ticker import NullFormatter

# SIS Functions
TE = 1 # Einstein radius
g1 = lambda x,y: (TE/2) * (y**2-x**2)/((x**2+y**2)**(3/2)) 
g2 = lambda x,y: -1*TE*x*y / ((x**2+y**2)**(3/2))
kappa = lambda x,y: TE / (2*np.sqrt(x**2+y**2))

coords = np.linspace(-2,2,400)
X,Y = np.meshgrid(coords,coords)
g1out = g1(X,Y)
g2out = g2(X,Y)
kappaout = kappa(X,Y)
for i in range(len(coords)):
    for j in range(len(coords)):
        if np.sqrt(coords[i]**2+coords[j]**2) <= TE:
            g1out[i][j]=0
            g2out[i][j]=0

fig = plt.figure()
fig.subplots_adjust(wspace=0,hspace=0)

# subplot number 1
ax1 = fig.add_subplot(1,2,1,aspect='equal',xlim=[-2,2],ylim=[-2,2])
plt.title(r"$\gamma_{1}$",fontsize="18")
plt.xlabel(r"x ($\theta_{E}$)",fontsize="15")
plt.ylabel(r"y ($\theta_{E}$)",rotation='horizontal',fontsize="15")
plt.xticks([-2.0,-1.5,-1.0,-0.5,0,0.5,1.0,1.5])
plt.xticks([-2.0,-1.5,-1.0,-0.5,0,0.5,1.0,1.5])
plt.imshow(g1out,extent=(-2,2,-2,2))
plt.axhline(y=0,linewidth=2,color='k',linestyle="--")
plt.axvline(x=0,linewidth=2,color='k',linestyle="--")
e1 = patches.Ellipse((0,0),2,2,color='white')
ax1.add_patch(e1)

# subplot number 2
ax2 = fig.add_subplot(1,2,2,sharey=ax1,xlim=[-2,2],ylim=[-2,2])
plt.title(r"$\gamma_{2}$",fontsize="18")
plt.xlabel(r"x ($\theta_{E}$)",fontsize="15")
ax2.yaxis.set_major_formatter( NullFormatter() )
plt.axhline(y=0,linewidth=2,color='k',linestyle="--")
plt.axvline(x=0,linewidth=2,color='k',linestyle="--")
plt.imshow(g2out,extent=(-2,2,-2,2))
e2 = patches.Ellipse((0,0),2,2,color='white')
ax2.add_patch(e2)

# subplot for colorbar
ax3 = fig.add_subplot(1,1,1)
ax3.axis('off')
cbar = plt.colorbar(ax=ax2)

plt.show()
4

12 に答える 12

386

カラーバーを独自の軸に配置し、使用subplots_adjustしてスペースを空けるだけです。

簡単な例として:

import numpy as np
import matplotlib.pyplot as plt

fig, axes = plt.subplots(nrows=2, ncols=2)
for ax in axes.flat:
    im = ax.imshow(np.random.random((10,10)), vmin=0, vmax=1)

fig.subplots_adjust(right=0.8)
cbar_ax = fig.add_axes([0.85, 0.15, 0.05, 0.7])
fig.colorbar(im, cax=cbar_ax)

plt.show()

ここに画像の説明を入力

im値の範囲が および によって設定されていても、色の範囲は最後にプロットされた ( を生成した)vminイメージによって設定されることに注意してくださいvmax。たとえば、別のプロットの最大値が高い場合、最大値よりも高い値を持つポイントimは均一な色で表示されます。

于 2012-12-09T05:20:00.423 に答える
184

軸のリストでのaxパラメーターを使用して、Joe Kington のコードを簡略化できます。ドキュメントfigure.colorbar()から:

なし | 新しいカラーバー軸のスペースが盗まれる親軸オブジェクト。軸のリストが指定されている場合、カラーバーの軸用のスペースを確保するためにすべてのサイズが変更されます。

import numpy as np
import matplotlib.pyplot as plt

fig, axes = plt.subplots(nrows=2, ncols=2)
for ax in axes.flat:
    im = ax.imshow(np.random.random((10,10)), vmin=0, vmax=1)

fig.colorbar(im, ax=axes.ravel().tolist())

plt.show()

1

于 2014-05-22T00:19:07.927 に答える
39

使用make_axesはさらに簡単で、より良い結果が得られます。また、カラーバーの配置をカスタマイズする可能性も提供します。subplotsまた、 x 軸と y 軸を共有するオプションにも注意してください。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl

fig, axes = plt.subplots(nrows=2, ncols=2, sharex=True, sharey=True)
for ax in axes.flat:
    im = ax.imshow(np.random.random((10,10)), vmin=0, vmax=1)

cax,kw = mpl.colorbar.make_axes([ax for ax in axes.flat])
plt.colorbar(im, cax=cax, **kw)

plt.show()

于 2014-01-23T09:22:27.947 に答える