2

x 軸と y 軸が対数であるデータの行列があります。imshowマトリックスを表示するために使用しようとしていますが、対数軸が必要なので、imshow軸の目盛りを に設定し[]、別の軸セットをオーバーレイします。

import matplotlib.pyplot as plt
import numpy as np

# the x,y max and min are the log values
array = np.zeros((2,2))
array[1,1] = -1
fig = plt.figure()
ax = plt.imshow(
    array, 
    extent = (0,1, 1, 0), 
    interpolation = 'nearest').get_axes()
ax.invert_yaxis()

# add a colorbar
# cb = plt.colorbar()      # <----- THIS CAUSES TROUBLE
# cb.set_label('zbar')

ax.set_aspect(1)
ax.xaxis.set_ticks([])
ax.yaxis.set_ticks([])
position = ax.get_position()
aspect = ax.get_aspect()

# overlay another set of axes 
ax_log = fig.add_subplot(111, frameon = False)
ax_log.set_xscale('log')
ax_log.set_yscale('log')
ax_log.axis((10**0, 10**1, 10**0, 10**1)) # old min and max but exponentiated  
ax_log.set_position(position)
ax_log.set_aspect(aspect)

plt.savefig('test.png', bbox_inches = 'tight')
plt.close()

カラーバーなしでこれはうまくいきます:

カラーバーなし

しかし、カラーバーを追加する行のコメントを外すと、奇妙なシフトが発生します:

カラーバー付き

カラーバーがどういうわけか画像を少し左にシフトしているように見えますが、get_position()カラーバーを作成した後に呼び出していることを考えると、これは奇妙に思えます。このプロットを作成する簡単な方法を見落としていますか? 簡単な修正はありますか?

4

1 に答える 1

2

少し調べてみると、回避策が見つかりました。もっと良い方法があるかもしれません...

問題はplt.colorbar()、それが描かれているプロットからスペースを「盗む」ことのようです。get_position()まだ適切な座標を返すことを期待しているので、これはまだ少し奇妙です。しかし、回避策としてGridSpec、生のColorbarコンストラクターを使用しました。

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.gridspec import GridSpec
from matplotlib.colorbar import Colorbar

# the x,y max and min are the log values
array = np.zeros((2,2))
array[1,1] = -1
fig = plt.figure()
gs = GridSpec(10,11)            # create a 10 x 11 grid
ax = plt.subplot(gs[:,0:-1])    # make subplot on 10 x 10 part 
im = plt.imshow(
    array, 
    extent = (0,1, 1, 0), 
    interpolation = 'nearest', 
    axes = ax)
ax.invert_yaxis()

# add a colorbar
cb_ax = plt.subplot(gs[:,-1])   # put the colorbar on the last column
cb = Colorbar(ax = cb_ax, mappable = im ) # use the raw colorbar constructor
cb.set_label('zbar')

ax.set_aspect(1)
ax.xaxis.set_ticks([])
ax.yaxis.set_ticks([])
position = ax.get_position()
aspect = ax.get_aspect()

# overlay another set of axes 
ax_log = fig.add_subplot(111, frameon = False) # can't use gridspec?
ax_log.set_xscale('log')
ax_log.set_yscale('log')
ax_log.axis((10**0, 10**1, 10**0, 10**1)) # old min and max but exponentiated  
ax_log.set_position(position)
ax_log.set_aspect(aspect)

plt.savefig('test.pdf', bbox_inches = 'tight')
plt.close()

オブジェクトを使用して 2 番目の軸のセットを初期化できないことも非常に奇妙ですGridSpec(そうすると、画像が消えます)。

于 2012-08-10T13:16:34.207 に答える