9

Tôi có một hình bao gồm một hình ảnh được hiển thị bởi imshow(), đường bao và trường vectơ được đặt bởi quiver(). Tôi đã tô màu trường vector dựa trên một đại lượng vô hướng khác. Ở bên phải của con số của tôi, tôi đã thực hiện một colorbar(). Điều này colorbar() đại diện cho các giá trị được hiển thị bởi imshow() (có thể dương và âm trong trường hợp của tôi). Tôi muốn biết làm thế nào tôi có thể thiết lập một thanh màu khác mà sẽ được dựa trên các giá trị của số lượng vô hướng mà màu sắc của các vectơ được dựa. Có ai biết làm thế nào để làm điều đó?Matplotlib: rung động và imshow chồng lên nhau, làm thế nào tôi có thể đặt hai thanh màu?

Dưới đây là ví dụ về hình ảnh tôi đã có thể thực hiện. Lưu ý rằng màu của các vectơ chuyển từ màu xanh sang màu đỏ. Theo thanh màu hiện tại, màu xanh dương có nghĩa là âm. Tuy nhiên tôi biết rằng số lượng đại diện bởi màu sắc của vector luôn luôn là tích cực.

enter image description here

Trả lời

7

Đơn giản chỉ cần gọi colorbar hai lần, ngay sau mỗi cuộc gọi âm mưu. Pylab sẽ tạo ra một thanh màu mới phù hợp với cốt truyện mới nhất. Lưu ý rằng, như trong ví dụ của bạn, các giá trị rung động nằm trong khoảng 0,1 trong khi imshow nhận giá trị âm. Để rõ ràng (không được hiển thị trong ví dụ này), tôi sẽ sử dụng các bản đồ màu khác nhau để phân biệt hai loại ô.

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

Oh đơn giản sao? Cảm ơn câu trả lời của bạn! Tôi tò mò: colorbar() biết dữ liệu nào cần xem? Làm thế nào nó hoạt động nếu tôi muốn làm điều đó từ quan điểm objets? – MCF

+0

@Heimdall từ các tài liệu: "Hình ảnh, Đường viền, v.v ... mà thanh màu áp dụng; đối số này là bắt buộc đối với phương thức colorbar() nhưng tùy chọn cho hàm colorbar(), đặt mặc định thành hình ảnh hiện tại". http://matplotlib.sourceforge.net/api/pyplot_api.html#matplotlib.pyplot.colorbar. Vì vậy, đối số mặc định 'colorbar' phải được đặt trong Nghệ sĩ được vẽ mới nhất. Các tài liệu cũng đề xuất một cách để có một kiểm soát tốt hơn hạt mà thanh màu -> cốt truyện. – Hooked

4

Chạy rung động không nhất thiết phải trả lại loại đối tượng trí trên bản đồ mà colorbar() yêu cầu. Tôi nghĩ rằng nó có thể là bởi vì tôi rõ ràng "đã tô màu trường vector dựa trên số lượng vô hướng khác" như Heimdall nói rằng họ đã làm. Do đó, câu trả lời của Hooked không hiệu quả với tôi.

Tôi phải tạo bản đồ của riêng mình cho thanh màu để đọc. Tôi đã làm điều này bằng cách sử dụng Normalize từ matplotlib.colors trên các dữ liệu mà tôi muốn sử dụng để tô màu vectơ rung động của tôi (mà tôi sẽ gọi C, đó là một loạt các hình dạng giống như X, Y, U, và V.)

gọi rung động của tôi trông như thế này:

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') 

Giving bất kỳ đối số khác đến chức năng colorbar đã cho tôi một loạt các lỗi.

My example, where vector color shows third data axis

+0

Bạn có thể vui lòng cho biết cách bạn tạo ra các màu sắc trong C? Cảm ơn! – pyan

+0

@pyan, trong trường hợp đó màu sắc đã được hiển thị * thời gian *, và tất cả các đối số là mảng 1D, do đó, nó đơn giản như một cái gì đó như 'C = dt * np.arange (len (X))' – askewchan

+0

Cảm ơn! Tôi nghĩ rằng đó là một cái gì đó liên quan đến độ lớn hoặc hướng. – pyan

Các vấn đề liên quan