2016-11-18 10 views
0

すべての列に関連付けられた属性がある画像があります。私は画像をプロットし、その属性値で各列にラベルを付けたいと思います。Matplotlibのラベルが重複しています

import matplotlib.pyplot as plt 
import numpy as np 
from scipy.ndimage.filters import gaussian_filter 

np.random.seed(200) 

cols = 600 
attr = list('abcdefghijklmnopqrstuvwxyz') * cols 
attr = labels[:cols] 
img = gaussian_filter(np.random.rand(400, cols), 100) 
plt.imshow(img, cmap='inferno') 
plt.xticks(np.arange(cols), attr) 
plt.show() 

次の結果イメージは、Xラベルがどのように乱雑になるかを示しています。私が望むのは、ズームやパンなど、プロットとやり取りするときに更新されるラベルを表示することです。

私はこれが可能だと思うのは、maplotlibのデフォルトの動作が正しいためです(xticksを設定しない場合)。それは、ラベルが重複しないように間隔でカラム番号を表示し、パンニングを&にズームすると更新されます。

私の質問は、カスタムラベルでデフォルトのmatplotlibのラベル動作を取得できるかどうかです。

重なるラベルtick formattingと呼ばれる何がしたい

enter image description here

デフォルトの動作

enter image description here

答えて

2

。この場合、FuncFormatterのインスタンスを作成し、それをメジャーティックに割り当てることができます。

まず、あなたの輸入にFuncFormatterを追加する必要があります。

import matplotlib.pyplot as plt 
from matplotlib.ticker import FuncFormatter 
import numpy as np 
from scipy.ndimage.filters import gaussian_filter 

あなたはダニ値とその位置を取り、目盛りラベルを返す関数が必要です。あなたはここの位置を必要としませんが、それはとにかく関数に渡されます。関数が予期しないティック値を処理できることを確認してください(私はmatplotlib 2.0.0b4を使用し、600でティックを入れました)。

rs = np.random.RandomState(seed=200) 
img = gaussian_filter(rs.rand(400, cols), 100) 
plt.imshow(img, cmap='inferno') 
plt.gca().xaxis.set_major_formatter(formatter) 

custom tick labels

はもちろん、この標識はありません:あなたのプロットのための主要なフォーマッタとして

formatter = FuncFormatter(format_tick(attr)) 

設定formatter

cols = 600 
letters = list('abcdefghijklmnopqrstuvwxyz') 
attr = (letters * (1 + cols // len(letters)))[:cols] 

def format_tick(labels): 
    def get_label(x, pos): 
     try: 
      return labels[int(round(x))] 
     except IndexError: 
      return '' 
    return get_label 

は、あなたのフォーマット機能を使用してFuncFormatterインスタンスを作成します。あなたのことで何の意味もない十分なデータ。実際のユースケースのために、それが何であれ、より良い方法があると確信しています。

関連する問題