2013-10-30 31 views
1

我繪製的數據文件中的點的顏色是通過調色板從0到1定義的。顏色是指文件列中的值;我分配一個調色板 「藍色」 的不同的色相:Gnuplot - 使用函數定義調色板的間距

組cbrange [0:1]

組調色板定義(1 「#B0E2FF」,2 「#87CEFA」,3 「#7EC0EE」 ,4 「#4F94CD」,5 「#4E78A0」,6 「#104E8B」,7 「#1B3F8B」,8 「#162252」)

的問題是,調色板得到線性的顏色間隔。因此,對於我的數據來說,這並不好,我希望在數值的中間範圍(大色塊)和極端精度(小色塊)中有更高的精度。

我發現我可以用在對數刻度調色板:

集日誌CB

但是,這當然是我不好或者是在給出我想要的。我需要將一個自定義函數應用於調色板中的空間值。那可能嗎?

回答

1

這是可能的,如果你有一個調色板根據三個函數定義,或者如果你有一個數據文件保存調色板值。

考慮一下,你有一個映射函數map(x)(即你的自定義函數),它從[0:1] -> [0:1]映射並拉伸/縮小灰度範圍。然後,你可以使用:

red(x) = ... 
green(x) = ... 
blue(x) = ... 
map(x) = ... 
set palette functions red(map(gray)), green(map(gray)), blue(map(gray)) 

並據此對文件:

map(x) = ... 
set palette file 'palette.dat' using (map($1)):2:3:4 

在您的情況,您可以:

  1. 像你想要的(例如用set palette defined ...
  2. 定義調色板
  3. 將調色板寫入外部數據文件。這寫入了一個數據集'紅',一個'綠',一個'藍'和一個NTSC灰度值。
  4. 重新排列數據文件以便對set palette file有用。這裏我用下面的python腳本palette.py

    import numpy as np 
    import sys 
    
    A = np.loadtxt(sys.stdin, usecols=(0,1)) 
    np.savetxt(sys.stdout, A.reshape(256,8, order='F')[:,(0,4,5,6,7)], fmt='%.3f') 
    
  5. 定義一個適當的map(x)功能。

下面是腳本:

# 1. 
set palette defined (1 "#B0E2FF", 2 "#87CEFA", 3 "#7EC0EE", 4 "#4F94CD", 5 "#4E78A0", 6 "#104E8B", 7 "#1B3F8B", 8 "#162252") 

# 2. 
set terminal push 
set terminal unknown 
set table 'palette.tmp' 
test palette 
unset table 
set terminal pop 

# 3. 
system('python palette.py <palette.tmp> palette.dat') 

# 4. 
map(x) = (-0.5+(2*(x-0.5))**3 + x)/3 + 0.5 
set palette file 'palette.dat' using (map($1)):2:3:4 

test palette