2017-11-01 34 views
1

私は天体の画像を上に(自動的に同じx軸の長さで)カラーバーを表示する関数を書こうとしています。 私は問題を抱えています。なぜなら、ティックを上に置くと何もしません...それはカラーバーの底に目盛りをつけます(そしてコロバーのy軸の目盛も) 。 X軸のWCS座標に問題があると思います。なぜなら、投影せずにそれを実行しようとするとうまくいくからです!MatplotlibのカラーバーとWCS投影

import numpy as np 
import matplotlib.pyplot as plt 
from astropy import wcs 
from matplotlib.colors import PowerNorm 
from mpl_toolkits.axes_grid1 import make_axes_locatable 
from matplotlib import cm 

#WCS coordinate system 
w = wcs.WCS(naxis=2) 
w.wcs.crpix = [23.5, 23.5] 
w.wcs.cdelt = np.array([-0.0035, 0.0035]) 
w.wcs.crval = [266.8451, -28.151658] 
w.wcs.ctype = ["RA---TAN", "DEC--TAN"] 
w.wcs.set_pv([(2, 1, 45.0)]) 

#generate an array as image test 
data = (np.arange(10000).reshape((100,100))) 

#display image 
fig = plt.figure() 
ax = plt.gca(projection=w) 
graf = ax.imshow(data, origin='lower', cmap=cm.viridis, norm=PowerNorm(1)) 

#colorbar 
divider = make_axes_locatable(ax) 
cax = divider.append_axes("top", size="5%") 
cbar = fig.colorbar(graf, cax=cax, orientation='horizontal') 
cax.xaxis.set_ticks_position('top') 
fig.show() 

ありがとうございます!

+0

を、我々はそれを実行できない場合は、コードのこの大きなブロックは、むしろ無用です。他の人が(少なくともあなたの現在のコードで可能な範囲で)実行できるように編集して、結果の画像または停止するエラーを確認してください。 – Gabriel

+0

これを短くするには:[mcve]を読んで質問を編集してください。 – ImportanceOfBeingErnest

+1

申し訳ありません私はコードを編集しました、今検証可能です! – Mikifiori

答えて

0

WCSAxesの内部機構を使用して、WCS投影の目盛りを処理する必要があります。 WCSAxesは、xaxis/yaxis属性(それほど使用されていないようです)ではなく、座標マップコンテナ(cbar.ax.coordsにあります)を介してカラーバーの目盛りを処理しているようです。

だから、あなたのコードを実行した後、次のトリックは私のために働いたとxticksは上に移動:

c_x = cbar.ax.coords['x'] 
c_x.set_ticklabel_position('t') 
cbar.update_normal(cax) 
+0

ありがとうございます!カラーバーの範囲(およびスケール)が間違っていることがわかりました。それは0から1000の間でなければなりません、そして、私が標準を変えれば、それはスケールを変えなければなりません...しかしそれは変わりません! – Mikifiori

+0

正しいティックラベルは 'cax.xaxis'に格納されているようですが、どういうわけかそれらを' WCSAxes'カラーバーにコピーできますか? –

関連する問題