9

Mam figurę, która składa się z obrazu wyświetlanego przez imshow(), konturu i pola wektorowego ustawionego przez quiver(). Pokolorowałem pole wektorowe na podstawie innej ilości skalarnej. Po prawej stronie mojej postaci wykonałem colorbar(). Ten colorbar() reprezentuje wartości wyświetlane przez imshow() (które mogą być w moim przypadku dodatnie i ujemne). Chciałbym wiedzieć, w jaki sposób mogę ustawić inny pasek koloru, który będzie oparty na wartościach skalarnej ilości, na której bazuje kolor wektorów. Czy ktoś wie, jak to zrobić?Matplotlib: kołczan i imshow nałożone, jak ustawić dwa paski kolorów?

Oto przykład obrazu, który udało mi się wykonać. Zauważ, że kolory wektorów zmieniają się z niebieskiego na czerwony. Zgodnie z aktualnym paskiem kolorów niebieski oznacza minus. Jednak wiem, że ilość reprezentowana przez kolor wektora jest zawsze dodatnia.

enter image description here

Odpowiedz

7

Wystarczy zadzwonić colorbar dwa razy, tuż po każdym wykreślania rozmowy. Pylab utworzy nowy pasek kolorów pasujący do ostatniego wykresu. Zauważ, że, jak w twoim przykładzie, wartości drgań wahają się od 0,1, podczas gdy imshow przyjmuje wartości ujemne. Dla jasności (nie pokazano w tym przykładzie) używałbym różnych map kolorów, aby rozróżnić dwa typy wykresów.

import numpy as np 
import pylab as plt 

# Create some sample data 
dx = np.linspace(0,1,20) 
X,Y = np.meshgrid(dx,dx) 
Z = X**2 - Y 
Z2 = X 

plt.imshow(Z) 
plt.colorbar() 

plt.quiver(X,Y,Z2,width=.01,linewidth=1) 
plt.colorbar() 

plt.show() 

enter image description here

+0

Czy to takie proste? Dzięki za odpowiedź! Jestem ciekawy: w jaki sposób colorbar() wie, na które dane patrzeć? Jak to działa, jeśli chcę to zrobić z perspektywy celów? – MCF

+0

@Heimdall z dokumentacji: "Obraz, ContourSet itp., Do którego odnosi się pasek koloru, ten argument jest obowiązkowy dla metody colorbar(), ale opcjonalny dla funkcji colorbar(), która ustawia wartość domyślną dla bieżącego obrazu." http://matplotlib.sourceforge.net/api/pyplot_api.html#matplotlib.pyplot.colorbar. Dlatego domyślnym argumentem 'colorbar' musi być najnowszy narysowany Artysta. Dokumenty sugerują także sposób na dokładniejszą kontrolę nad tym, który pasek kolorów -> działka. – Hooked

4

Running kołczan niekoniecznie zwracają typ obiektu, który colorbar() odwzorowywalne wymaga. Myślę, że może tak być dlatego, że wyraźnie "pokolorowałem pole wektorowe na podstawie innej ilości skalarnej", jak twierdzi Heimdall. Dlatego odpowiedź Hooked'a nie zadziałała dla mnie.

Musiałem stworzyć własne zdjęcie, aby można było je odczytać. Zrobiłem to za pomocą Normalize z matplotlib.colors na danych, które chciałem wykorzystać do koloru moich wektorów kołczan (które Zadzwonię C, która jest tablicą o tym samym kształcie jak X, Y, U i V.)

Moje wezwanie kołczan wygląda następująco:

import matplotlib.pyplot as pl 
import matplotlib.cm as cm 
import matplotlib.colors as mcolors 
import matplotlib.colorbar as mcolorbar 
pl.figure() 

nz = mcolors.Normalize() 
nz.autoscale(C) 

pl.quiver(X, Y, U, V, color=cm.jet(nz(C))) 
cax,_ = mcolorbar.make_axes(pl.gca()) 
cb = mcolorbar.ColorbarBase(cax, cmap=cm.jet, norm=nz) 
cb.set_label('color data meaning') 

podając żadnych innych argumentów do funkcji colorbar dał mi wiele błędów.

My example, where vector color shows third data axis

+0

Czy możesz pokazać, w jaki sposób wygenerowałeś kolory w C? Dzięki! – pyan

+0

@pyan, w tym przypadku kolor pokazywał * czas *, a wszystkie te argumenty są tablicami 1D, więc było tak proste jak coś takiego jak 'C = dt * np.arange (len (X))' – askewchan

+0

Dzięki! Myślałem, że to coś związanego z wielkością lub kierunkiem. – pyan

Powiązane problemy