2013-07-23 35 views
5

Tôi hiện đang đối mặt với vấn đề hình dung dữ liệu ba chiều. Cụ thể, tôi có hai tham số khác nhau và thứ nguyên thứ ba là kết quả đầu ra mà trong trường hợp này là một giá trị giữa 0 và một (phần trăm).Kết hợp nhiều bản đồ nhiệt trong matplotlib

Tôi có một số tập dữ liệu riêng biệt mà tôi muốn minh họa. Nó hoạt động tốt với việc sử dụng heatmaps trong matplotlib (pcolor).

Tuy nhiên, tôi muốn so sánh trực tiếp các tập dữ liệu riêng biệt với nhau. Tôi không hoàn toàn hài lòng với việc tạo ra một cốt truyện riêng biệt cho mỗi tập dữ liệu và đại diện cho nó theo cách này. Tôi bằng cách nào đó muốn âm mưu nó trong một con số để có thể trực tiếp so sánh chúng.

Tôi đã thử các ô 3D (phân tán và bề mặt) đang hoạt động khá tốt, nhưng các giá trị chồng chéo và hầu hết thời gian bạn chỉ có thể thấy một tập dữ liệu. Các lô 3D thực sự không hoạt động tốt.

Vì vậy, câu hỏi chính của tôi là nếu ai đó có ý tưởng về cách tôi có thể đại diện cho điều này trong một cốt truyện.

Trân trọng!

Trả lời

2

Có một vài lựa chọn để giới thiệu 2 bộ dữ liệu với nhau:

Tùy chọn 1 - vẽ một bản đồ nhiệt của sự khác biệt của 2 bộ dữ liệu (hoặc tỷ lệ, bất cứ điều gì là thích hợp hơn trong trường hợp của bạn)

pcolor(D2-D1) 

và sau đó trình bày một số các số liệu so sánh này.

Lựa chọn 2 - hiện 1 bộ dữ liệu như pcolor, và một người khác như countour:

:

pcolor(D1) 
contour(D2) 

Nếu bạn thực sự cần phải chương N> 2 bộ dữ liệu lại với nhau, tôi sẽ đi với đường viền hoặc contourf

contourf(D1,cmap='Blues') 
contourf(D2,cmap='Reds', alpha=0.66) 
contourf(D2,cmap='Reds', alpha=0.33) 

example output of 3 contourf commands

hoặc

contour(D1,cmap='Blues') 
contour(D2,cmap='Reds') 
contour(D2,cmap='Reds') 

example output of 3 contour commands

không may, thủ đoạn alpha simiar không làm việc tốt với pcolor.

+0

Cám ơn gợi ý đó. Tôi thích cách tiếp cận contourf. Tuy nhiên, bằng cách nào đó các giá trị alpha dường như không hoạt động tốt. Cốt truyện nhiều hơn tôi thêm vào với các giá trị alpha thấp hơn, cũng là phần chính với giá trị alpha 1.0 được giảm bớt. Điều này có nghĩa vụ phải làm việc theo cách đó không? – fsociety

0

Cách đẹp nhất tôi có thể nghĩ đến là vẽ sơ đồ một chiều cao (ví dụ: bề mặt) và hình kia dưới dạng bản đồ nhiệt được ánh xạ lên bề mặt này. Câu trả lời được đưa ra here bởi @HYRY là một ví dụ có màu ngẫu nhiên, bạn sẽ cần chỉ định mảng colors bằng một trong các bộ dữ liệu của bạn

Bạn cũng có thể nghĩ về cách chúng liên quan bạn có thể nhận được một số thông số khác mã hóa những gì đang xảy ra hoặc trừ chúng không?

1

Mặc dù nó là một câu hỏi cũ, tôi gần đây đã làm một cái gì đó liên quan: âm mưu hai heatmaps trong cùng một con số. Tôi đã làm điều đó bằng cách chuyển đổi các ô vuông thành các ô phân tán nơi tôi chuyển đổi các hình vuông thành hai hình tam giác.

tôi đã thực hiện hai tam giác bằng cách sử dụng dấu tùy chỉnh:

import matplotlib 
import matplotlib.pyplot as plt 
import numpy as np 

def getCustomSymbol1(path_index=1): 
    if path_index==1: #upper triangle 
     verts = [ 
     (0.0,0.0), 
     (1.0,0.0), 
     (1.0,1.0), 
     (0.0,0.0),] 
    else:    #lower triangle 
     verts = [ 
     (0.0,0.0), 
     (0.0,1.0), 
     (1.0,1.0), 
     (0.0,0.0),] 
    codes = [matplotlib.path.Path.MOVETO, 
      matplotlib.path.Path.LINETO, 
      matplotlib.path.Path.LINETO, 
      matplotlib.path.Path.CLOSEPOLY, 
      ] 
    pathCS1 = matplotlib.path.Path(verts, codes) 
    return pathCS1, verts 

def plot_mat(matrix=np.random.rand(20,20), path_index=1, alpha=1.0, vmin=0., vmax=1.): 
    nx,ny = matrix.shape 
    X,Y,values = zip(*[ (i,j,matrix[i,j]) for i in range(nx) for j in range(ny) ]) 
    marker,verts = getCustomSymbol1(path_index=path_index) 
    ax.scatter(X,Y,s=4000, 
       marker=marker, 
       c=values, 
       cmap='viridis', 
       alpha=alpha, 
       vmin=vmin, vmax=vmax) 
    return 

fig = plt.figure() 
ax = fig.add_subplot(111) 
A = np.random.uniform(20,50,30).reshape([6,5]) 
B = np.random.uniform(40,70,30).reshape([6,5]) 
vmin = np.min([A,B]) 
vmax = np.max([A,B]) 
plot_mat(path_index=1,vmin=vmin,vmax=vmax,matrix=A) 
plot_mat(path_index=2,vmin=vmin,vmax=vmax,matrix=B) 
plt.xlim([0,6]) 
plt.ylim([0,5]) 
# for the colorbar i did the trick to make first a fake mappable: 
sm = plt.cm.ScalarMappable(cmap='viridis', norm=plt.Normalize(vmin=vmin, vmax=vmax)) 
sm._A=[] 
plt.colorbar(sm) 
plt.show() 

Đó cùng nhau có thể cung cấp cho bạn một cái gì đó như: enter image description here

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