2011-06-27 5 views
8

Mã python sau tạo một bản đồ nhiệt của một ma trận có chứa các giá trị phân phối chuẩnrộng phi tuyến tính của một bản đồ màu để tăng cường độ tương phản

import numpy as np 
from matplotlib import pylab as plt 


np.random.seed(123) #make sure we all have same data 
m = np.random.randn(200).reshape(10, 20) 
plt.imshow(m, cmap='RdYlGn', interpolation='nearest') 
plt.colorbar() 

Đây là sản phẩm của mã này

example 1

Tôi muốn nâng cao độ tương phản của hình ảnh này bằng cách "mờ dần" các giá trị gần bằng không. Tôi có thể dễ dàng thực hiện việc này bằng cách sử dụng chia tỷ lệ disigmoid của dữ liệu gốc như sau:

def disigmoidScaling(values, steepnessFactor=1, ref=None): 
    ''' Sigmoid scaling in which values around a reference point are flattened 
    arround a reference point 

    Scaled value y is calculated as 
     y = sign(v - d)(1 - exp(-((x - d)/s)**2))) 
    where v is the original value, d is the referenc point and s is the 
    steepness factor 
    ''' 
    if ref is None: 
     mn = np.min(values) 
     mx = np.max(values) 
     ref = mn + (mx - mn)/2.0 

    sgn = np.sign(values - ref) 
    term1 = ((values - ref)/steepnessFactor) ** 2 
    term2 = np.exp(- term1) 
    term3 = 1.0 - term2 
    return sgn * term3 


plt.imshow(disigmoidScaling(m, 4), cmap='RdYlGn', interpolation='nearest') 
plt.colorbar() 

Đây là đầu ra.

example 2

Tôi hài lòng với kết quả, ngoại trừ một thực tế rằng trong phiên bản này giá trị ban đầu đã được trao đổi cho những người thu nhỏ lại.

Có cách nào để thực hiện ánh xạ các giá trị phi tuyến tính để cố định không?

+0

Câu hỏi này cũng có thể được quan tâm ở đây: https://stackoverflow.com/questions/46038206/arbirtrary-non-linear-colorbar-using-matplotlib – ImportanceOfBeingErnest

Trả lời

4

Bản đồ màu có chứa từ điển giá trị màu đỏ, xanh lá cây và xanh lam được ánh xạ trong khoảng [0,1]. Các Linear Segmented Colormap docs lớp cho ví dụ

cdict = {'red': [(0.0, 0.0, 0.0), 
       (0.5, 1.0, 1.0), 
       (1.0, 1.0, 1.0)], 

    'green': [(0.0, 0.0, 0.0), 
       (0.25, 0.0, 0.0), 
       (0.75, 1.0, 1.0), 
       (1.0, 1.0, 1.0)], 

    'blue': [(0.0, 0.0, 0.0), 
       (0.5, 0.0, 0.0), 
       (1.0, 1.0, 1.0)]} 

"Mỗi hàng trong bảng cho một màu nhất định là một chuỗi các x, y0, tuples y1. Trong mỗi chuỗi, x phải tăng đơn điệu từ 0 đến 1. Đối với bất kỳ giá trị đầu vào z giảm giữa x [i] và x [i + 1], giá trị đầu ra của một màu nhất định sẽ được nội suy tuyến tính giữa y1 [i] và y0 [i + 1]: "

Các bản đồ màu RdYlGn 11 x giá trị cho mỗi màu sẽ từ 0 đến 1.0 theo các bước của 0,1. Bạn có thể lấy cdict giá trị bằng cách gọi

plt.cm.RdYlGn._segmentdata 

Sau đó bạn có thể thay đổi các giá trị x để bất cứ điều gì bước bạn muốn (miễn là họ đang gia tăng đơn điệu và phạm vi 0-1) và có được một bản đồ màu mới bằng cách gọi matplotlib.colors.LinearSegmentedColormap trên số cdict mới của bạn. Có một số ví dụ tuyệt vời về điều này trong số Matplotlib Cookbook.