Gnuplot: неопределенные/отсутствующие datapoints и стиль построения «с изображением»

Мне нужно создать цветную карту, а стиль построения «с изображением» делает именно то, что я хочу. (запишите точное значение z в позиции x, y, поэтому использование pm3d для меня не является вариантом)

Проблема в том, что в моем файле данных есть неопределенные точки. Например, функция представляет собой отношение массы, и поэтому отрицательные значения z не имеют физического смысла, и я хочу их опустить. Или некоторые z-значения даже «NaN».

Пример файла данных:

1.0   1.0    1.5
1.0   2.0    1.7
1.0   3.0    1.9
2.0   1.0    1.6
2.0   2.0    1.8
2.0   3.0    2.0
3.0   1.0    1.7
3.0   2.0    1.9
3.0   3.0   -1.0

Поэтому я не хочу строить значение -1 в позиции (3,3), но оставить пиксель в (3,3) пустым.

Я попробовал это:

plot './test.dat' u 1:2:($3>0 ? $3 : 1/0) with image

но это не сработает. В нем говорится:

warning: количество пикселей не может быть учтено в целых числах, соответствующих сетке. N = 8 K = 3

set datafile missing "NaN"

в случае, если -1.0 заменяется на «NaN», также не работает.

единственная альтернатива, которую я нашел:

set pointsize 10
plot './test.dat' u 1:2:($3>0 ? $3 : 1/0) palette pt 5

но затем мне нужно вручную отрегулировать размер точек, x- и y-диапазон и размер графика для каждого графика, чтобы не было пробелов или перекрытий точек данных. (См. этот вопрос .)

Итак, коротко отрезать длинную историю: есть ли способ использовать стиль построения «с изображением» с неопределенными/отсутствующими точками данных и оставлять эти точки белыми?

4
nl ja de

1 ответы

Я не нашел способ сделать gnuplot обработкой NaN красиво в этом случае. Он устанавливает для меня 1, что кажется странным, но может быть особенностью того, как «plot ... with image» обрабатывает отсутствующие данные.

Существует один трюк, который вы можете использовать, если хотите удалить отрицательные числа:

#!/usr/bin/env gnuplot

set terminal png 
set output 'test.png'

filter(x) = (x > 0) ? x : 1/0 
philter(x) = (x > 0) ? x : 0 

# just in case
set zero 1e-20

# make points set to zero be white
set palette defined (0 1.0 1.0 1.0, \
                 1e-19 0.0 0.0 1.0, \
                     1 1.0 0.0 0.0)

# get min/max for setting color range
stats 'test.dat' u (filter($3)) nooutput

# set color range so minimum value is not plotted as white
set cbrange [STATS_min*(1-1e-6):STATS_max]

plot './test.dat' u 1:2:(philter($3)) with image

On your datafile it produces this plot: enter image description here

Это не совсем идеально, так как есть белый бит в нижней части цветной панели, и он не обрабатывает NaN. Причина, по которой невозможно избавиться от белого бита, заключается в том, что при настройке палитры используемые числа просто автомасштабированы, чтобы соответствовать любой цветной панели, и есть дискретное количество слотов в палитре (256?). Таким образом, первый слот в палитре всегда будет показывать значение для начала палитры (белый), независимо от того, будет ли следующий цвет в палитре отображать 1е-19 пути по шкале.

2
добавлено
Спасибо за ваш ответ, это что-то;) Он выглядит хорошо (без белого бита внизу базы данных) в терминале pngcairo.
добавлено автор Regenbogenmaschine, источник