web-dev-qa-db-ja.com

Matplotlibなので、ログ軸には指定されたポイントにマイナーな目盛りラベルしかありません。カラーバーの目盛りラベルのサイズも変更します

プロットを作成しようとしていますが、上記のように対数目盛が表示されている場所に、目盛りラベルを表示したいだけです。 50、500、2000のマイナーティックラベルのみを表示したい。表示するマイナーティックラベルを指定する方法はありますか?私はこれを少しの間理解しようとしてきましたが、良い解決策を見つけられませんでした。私が考えることができるのは、minorticklabels()を取得し、fontsizeを0に設定することだけです。これは、コードの最初のスニペットの下に示されています。もっとクリーンな解決策があることを望んでいました。

もう1つは、私が理解していないカラーバーの目盛りラベルのサイズを変更することです。これを行う方法を誰かが知っている場合は、これを簡単に行う方法がカラーバーに表示されないので、私に知らせてください。

最初のコード:

fig = figure(figto)
ax = fig.add_subplot(111)
actShape = activationTrace.shape
semitones = arange(actShape[1])
freqArray = arange(actShape[0])
X,Y = meshgrid(self.testFreqArray,self.testFreqArray)
Z = sum(activationTrace[:,:,beg:end],axis=2)
surf = ax.contourf(X,Y,Z, 8, cmap=cm.jet)
ax.set_position([0.12,0.15,.8,.8])
ax.set_ylabel('Log Frequency (Hz)')
ax.set_xlabel('Log Frequency (Hz)')
ax.set_xscale('log')
ax.set_yscale('log')
ax.xaxis.set_minor_formatter(FormatStrFormatter('%d'))
ax.yaxis.set_ticks_position('left')
ax.xaxis.set_ticks_position('bottom')
ax.tick_params(axis='both',reset=False,which='both',length=8,width=2)
self.plotSetAxisLabels(ax,22)
self.plotSetAxisTickLabels(ax,18)
cbar = fig.colorbar(surf, shrink=0.5, aspect=20, fraction=.12,pad=.02)
cbar.set_label('Activation',size=18)
return ax, cbar

enter image description here

2番目のコード:

fig = figure(figto)
ax = fig.add_subplot(111)
actShape = activationTrace.shape
semitones = arange(actShape[1])
freqArray = arange(actShape[0])
X,Y = meshgrid(self.testFreqArray,self.testFreqArray)
Z = sum(activationTrace[:,:,beg:end],axis=2)
surf = ax.contourf(X,Y,Z, 8, cmap=cm.jet)
ax.set_position([0.12,0.15,.8,.8])
ax.set_ylabel('Log Frequency (Hz)')
ax.set_xlabel('Log Frequency (Hz)')
ax.set_xscale('log')
ax.set_yscale('log')
ax.xaxis.set_minor_formatter(FormatStrFormatter('%d'))
ax.yaxis.set_minor_formatter(FormatStrFormatter('%d'))
ax.yaxis.set_ticks_position('left')
ax.xaxis.set_ticks_position('bottom')
ax.tick_params(axis='both',reset=False,which='both',length=8,width=2)
self.plotSetAxisLabels(ax,22)
self.plotSetAxisTickLabels(ax,18)
cbar = fig.colorbar(surf, shrink=0.5, aspect=20, fraction=.12,pad=.02)
cbar.set_label('Activation',size=18)
count = 0
for i in ax.xaxis.get_minorticklabels():
    if (count%4 == 0):
        i.set_fontsize(12)
    else:
        i.set_fontsize(0)
    count+=1
for i in ax.yaxis.get_minorticklabels():
    if (count%4 == 0):
        i.set_fontsize(12)
    else:
        i.set_fontsize(0)
    count+=1
return ax, cbar

enter image description here

カラーバーの場合:理解しようとしているが完全にはわからないために気にしない場合のもう1つの簡単な質問。 ScalarFormatterで取得できる科学的表記を使用したいと思います。小数点以下の桁数と乗数を設定するにはどうすればよいですか?スペースを節約するために、これらすべてのゼロを配置するのではなく、8x10 ^ 8または.8x10 ^ 9のようにしたいと思います。 Axesオブジェクト内でこれを行うには複数の方法があると思いますが、最善の方法は何だと思いますか。 ScalarFormatterに変更するときに表記を変更する方法がわかりません。

グラフの場合:また、私のデータには、46から始まり、2 ^(1/12)を掛けたものの連続した乗算でポイントがあります。したがって、46,49,50,55,58,61 ... 3132です。これらはすべて丸みを帯びていますが、2 ^(1/12)の近くにあります。これらの数字の近くに主要なティッカーを配置する方がよいと判断しました。固定フォーマッターを使用し、freqArrayで15程度ごとにティッカーを使用するための最良の方法です。次に、1つおきの頻度でマイナーティッカーを使用します。これを実行しても、対数軸を維持できますか?

19
J Spen

1)FixedLocatorを使用して、明示的なティック位置を静的に定義します。

2)カラーバーcbarにはax属性があり、目盛りの書式設定を含む通常の軸メソッドへのアクセスを提供します。

import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111)
x = np.arange(10,3000,100)
y = np.arange(10,3000,100)
X,Y = np.meshgrid(x,y)
Z = np.random.random(X.shape)*8000000
surf = ax.contourf(X,Y,Z, 8, cmap=plt.cm.jet)
ax.set_ylabel('Log Frequency (Hz)')
ax.set_xlabel('Log Frequency (Hz)')
ax.set_xscale('log')
ax.set_yscale('log')
ax.xaxis.set_minor_formatter(plt.FormatStrFormatter('%d'))
# defining custom minor tick locations:
ax.xaxis.set_minor_locator(plt.FixedLocator([50,500,2000]))
ax.yaxis.set_ticks_position('left')
ax.xaxis.set_ticks_position('bottom')
ax.tick_params(axis='both',reset=False,which='both',length=8,width=2)
cbar = fig.colorbar(surf, shrink=0.5, aspect=20, fraction=.12,pad=.02)
cbar.set_label('Activation',size=18)
# access to cbar tick labels:
cbar.ax.tick_params(labelsize=5) 
plt.show()

enter image description here

編集

ティックマールが必要であるが、ラベルを選択的に表示したい場合は、フォントサイズをゼロにする代わりにset_visibleを使用する場合を除いて、反復に問題はありません。

FuncFormatterを使用して、より細かい制御を楽しむことができます。ここで、ティックの値または位置を使用して、ティックを表示するかどうかを決定できます。

def show_only_some(x, pos):
    s = str(int(x))
    if s[0] in ('2','5'):
        return s
    return ''

ax.xaxis.set_minor_formatter(plt.FuncFormatter(show_only_some))
111
Paul

@Paulからの回答に基づいて、次の関数を作成しました。

def get_formatter_function(allowed_values, datatype='float'):
    """returns a function, which only allows allowed_values as axis tick labels"""
    def hide_others(value, pos):
        if value in allowed_values:
            if datatype == 'float':
                return value
            Elif datatype == 'int':
                return int(value)
        return ''
    return hide_others

これはもう少し柔軟性があります。

0