2015-09-08 12 views
15

Tworzę interaktywne wątki i chcę dodać legendę paska kolorów. Nie chcę, aby pasek kolorów był we własnych osiach, dlatego chcę go dodać do istniejących osi. Mam trudności z tym, ponieważ większość przykładowego kodu, który znalazłem tworzy nowe osie dla paska kolorów.Dodaj pasek kolorów do istniejącej osi

Próbowałem następujący kod przy użyciu matplotlib.colorbar.ColorbarBase, który dodaje pasek kolorów do istniejących osi, ale daje mi dziwne wyniki i nie mogę dowiedzieć się, jak określić atrybuty paska kolorów (na przykład, gdzie na osiach jest on umieszczony i jaki rozmiar jest)

import matplotlib 
import matplotlib.pyplot as plt 
from matplotlib.cm import coolwarm 
import numpy as np 

x = np.random.uniform(1, 10, 10) 
y = np.random.uniform(1, 10, 10) 
v = np.random.uniform(1, 10, 10) 

fig, ax = plt.subplots() 

s = ax.scatter(x, y, c=v, cmap=coolwarm) 

matplotlib.colorbar.ColorbarBase(ax=ax, cmap=coolwarm, values=sorted(v), 
           orientation="horizontal") 

Korzystanie fig.colorbar zamiast matplotlib.colorbar.ColorbarBase wciąż nie daje mi zupełnie co chcę, a ja nadal nie wiem jak ustawić atrybuty colorbar.

fig.colorbar(s, ax=ax, cax=ax) 

enter image description here

Powiedzmy, że chcesz mieć colorbar w lewym górnym rogu, rozciąganie około połowy całej górnej części działki. Jak mam to zrobić?

Czy lepiej napisać niestandardową funkcję do tego, może za pomocą LineCollection?

+0

nie mam odpowiedź na to pytanie. Dlaczego jednak chcesz, aby pasek koloru był częścią istniejącej osi, a nie nową osią? – tnknepp

+0

@tnknepp Tworzę interaktywne wątki z powiększaniem/przesuwaniem, włączaniem i wyłączaniem wykresów itp. Po prostu łatwiej będzie mi nie tworzyć nowych osi dla paska kolorów –

+0

dlaczego nie możesz po prostu użyć ' fig.colorbar (ax = ax) '? – tom

Odpowiedz

18

Pasek kolorów musi mieć własne osie. Możesz jednak utworzyć osie, które pokrywają się z poprzednim. Następnie użyj wartości kwarg cax, aby powiedzieć fig.colorbar, aby użyć nowych osi.

Na przykład

import numpy as np 
import matplotlib.pyplot as plt 

data = np.arange(100, 0, -1).reshape(10, 10) 

fig, ax = plt.subplots() 
cax = fig.add_axes([0.27, 0.8, 0.5, 0.05]) 

im = ax.imshow(data, cmap='gist_earth') 
fig.colorbar(im, cax=cax, orientation='horizontal') 
plt.show() 

enter image description here

+1

To nie działa z osią 3d – derchambers

21

Ta technika jest zazwyczaj wykorzystywane do osi wielokrotnej w postaci. W tym kontekście często wymagany jest kolorowy pasek barwny , który odpowiada rozmiarem z wynikiem imshow. ten można osiągnąć łatwo z zestawem axes grid narzędziowej:

import numpy as np 
import matplotlib.pyplot as plt 
from mpl_toolkits.axes_grid1 import make_axes_locatable 

data = np.arange(100, 0, -1).reshape(10, 10) 

fig, ax = plt.subplots() 
divider = make_axes_locatable(ax) 
cax = divider.append_axes('right', size='5%', pad=0.05) 

im = ax.imshow(data, cmap='bone') 

fig.colorbar(im, cax=cax, orientation='vertical') 
plt.show() 

Image with proper colorbar in size

+2

Ta metoda rozwiązała mój problem, gdy osie zawierały mapę bazową (poprzednia odpowiedź rozciągnęła mapę bazową). Dzięki za to! – blaylockbk

Powiązane problemy