2013-05-16 16 views
11

Piszę trochę grafiki w Pythonie z matplotlib, i włączę je do papieru LaTeX (przy użyciu miłego, tabelarycznego wyrównania LaTex zamiast błahy z matplotlib's ImageGrid, itp.). Chciałbym utworzyć i zapisać autonomiczny pasek kolorów za pomocą savefig, bez konieczności używania imshow.Standalone colorbar (matplotlib)

(parametry vlim, vmax, jak również cmap może być udzielone jawnie)

Jedynym sposobem udało mi się znaleźć była dość skomplikowana i (z tego co rozumiem) rysuje zakodowane prostokąt na płótnie: http://matplotlib.org/examples/api/colorbar_only.html

Czy istnieje elegancki sposób na stworzenie niezależnego paska kolorów z matplotlib?

+5

Szczerze, który wygląda jak zrobili większość pracy dla Ciebie .. Nie wiem, czy znajdziesz coś lepszego niż to, że możesz zapisać, zdefiniować mapę kolorów, zakresy itp. Naraz. – mdscruggs

+0

Chciałbym podkreślić, że to, co mówisz, wygląda na skomplikowane w tym, co 'plt.colorbar' robi dla ciebie za kulisami. – tacaswell

+0

@tcaswell Zgadzam się, oczywiście. Właśnie zastanawiałem się, czy istnieje bardziej eleganckie rozwiązanie, które nie wymagało reimplementacji 'plt.colorbar'; połączone rozwiązanie jest dobre do wycinania i wklejania, ale wydaje się nieeleganckie w porównaniu do wywoływania 'plt.colorbar()' po 'plt.imshow' z pustą macierzą (uwaga dla potomności: to nie działa). – user

Odpowiedz

16

Możesz stworzyć jakiś sztuczny obraz, a następnie ukryć jego topór. Narysuj swój pasek koloru w niestandardowych osiach.

import pylab as pl 
import numpy as np 

a = np.array([[0,1]]) 
pl.figure(figsize=(9, 1.5)) 
img = pl.imshow(a, cmap="Blues") 
pl.gca().set_visible(False) 
cax = pl.axes([0.1, 0.2, 0.8, 0.6]) 
pl.colorbar(orientation="h", cax=cax) 
pl.savefig("colorbar.pdf") 

wynik:

enter image description here

+0

O tym właśnie mówię! – user

+5

Rzuca to dla mnie argument "AssertionError" jako "pozycję assert ==" u góry "lub pozycję ==" bottom "". Zmiana kodu na '' pl.colorbar (orientation = 'horizontal', cax = cax) '' naprawił problem i wygenerował wyniki, których szukałem. Może to być jakiś problem z wersją. – Nras

2

Stosując ten sam pomysł, jak w odpowiedzi HYRY, o ile chcesz „autonomicznego” colorbar w tym sensie, że jest on niezależny od pozycji na rysunku (nie jest bezpośrednio związane z tym, jak są one kolorowe), można zrobić coś jak następuje:

from matplotlib import pyplot as plt 
import numpy as np 

# create dummy invisible image 
# (use the colormap you want to have on the colorbar) 
img = plt.imshow(np.array([[0,1]]), cmap="Oranges") 
img.set_visible(False) 

plt.colorbar(orientation="vertical") 

# add any other things you want to the figure. 
plt.plot(np.random.rand(30)) 
+0

Bardzo ładne rozwiązanie! –

0

tak, to w oparciu o this answer here, jeśli jesteś jak ja i chcą uniknąć tego brzydkiego fałszywy plt.imshow(), można to zrobić na dwa podstawowe linie:

import matplotlib as mpl 
import matplotlib.pyplot as plt 


fig, ax = plt.subplots() 
col_map = plt.get_cmap('nipy_spectral') 
mpl.colorbar.ColorbarBase(ax, cmap=col_map, orientation = 'vertical') 

# As for a more fancy example, you can also give an axes by hand: 
c_map_ax = fig.add_axes([0.2, 0.8, 0.6, 0.02]) 
c_map_ax.axes.get_xaxis().set_visible(False) 
c_map_ax.axes.get_yaxis().set_visible(False) 

# and create another colorbar with: 
mpl.colorbar.ColorbarBase(c_map_ax, cmap=col_map, orientation = 'horizontal') 

picture of resulting figure

Powiązane problemy