Как улучшить рендеринг градиентов и элементов заливки в Gnuplot?

Я заметил, что Gnuplot создает уродливые артефакты при работе с заполненными элементами.

Один экземпляр находится в палитре следующего рисунка:

palette

Другой пример - использование filledcurves между двумя кривыми, определенными из точек в файлах ASCII. В этом случае вы можете видеть, что вместо настоящей сплошной заливки между линиями область заполняется количеством полос, которые становятся очевидными только после небольшого масштабирования, но это оказывает очень сильное влияние при растрировании изображения в PNG или похожий:

полосы

Кажется, это не зависит от терминала. Я пробовал postscrip, pdfcairo и даже tikz. Есть ли что-нибудь, что можно сделать, чтобы улучшить это, или это жесткое ограничение Gnuplot?


person Onturenio    schedule 02.07.2015    source источник
comment
Хорошее фото! К сожалению, с этими артефактами мало что можно сделать. Они появляются, когда два полигона соприкасаются друг с другом. То же самое происходит при построении with pm3d, см. Мое объяснение в проблемном шаблоне муара в изображении, созданном с помощью gnuplot pm3d и вывода pdf. Однако этот способ обхода не работает в вашем случае. У меня уже давно есть такая же проблема с заполненными кривыми в моем списке задач ... Обходной путь, который я использую, - это написать скрипт python, который генерирует полигональные объекты из ваших файлов данных. Могу опубликовать позже.   -  person Christoph    schedule 02.07.2015
comment
Итак, идея состоит в том, чтобы предварительно обработать данные для создания многоугольника из трех столбцов и построить его с закрашенными кривыми, верно? Получается хорошая заливка? Если так, то неплохо было бы предположить, что это действительно стандартное поведение Gnuopot под капотом, не так ли? Кстати 1, было бы неплохо, если бы вы могли поделиться этим скриптом. Кстати 2, что вы имеете в виду под моим списком дел? Вы разработчик Gnuplot?   -  person Onturenio    schedule 03.07.2015
comment
Да, я внес в gnuplot некоторые функции и патчи :) Если вы определите каждую кривую как многоугольники с set object polygon from ... to ... to ..., вы получите красивую заливку. Чтобы создать этот многоугольник, вам понадобится внешний скрипт (мой скрипт здесь не нужен, он был специально разработан для моего случая). Но опять же, вы не можете использовать lc palette frac и не получаете цветовую карту. Так что это решение было бы довольно громоздким, но не невозможным. Во время написания диссертации те же самые артефакты меня очень беспокоили, поэтому я пошел в долгий путь. И я всегда хотел исправить это в коде, но пока не стал.   -  person Christoph    schedule 03.07.2015
comment
@Schorsch Я попытался дать разумный ответ.   -  person Christoph    schedule 11.07.2015


Ответы (1)


К сожалению, это артефакт из-за сглаживания в средстве просмотра документов, когда два заполненных многоугольника соприкасаются друг с другом. Это происходит со стилем построения filledcurves, который составляет заполненную область многих четырехугольников, а также со стилем pm3d (как вы можете видеть в палитре цветов, которая показывает те же артефакты). См. Также проблемный узор муара в изображении, созданном с помощью gnuplot pm3d и вывода pdf. для конкретного демонстрационного случая.

Есть обходной путь, который, однако, очень громоздкий. Вы должны сгенерировать заполненный полигональный объект с помощью некоторого скрипта, заполнить его, использовать stats для определения диапазонов, построить пустой график (см., Например, Gnuplot - как я могу получить фигуру без точки? (я хочу иметь только оси, заголовок и метки x и y)).

Я предполагаю, что у вас есть файл данных с тремя столбцами, и вы можете построить их с помощью

plot 'test.dat' using 1:2:3 with filledcurves

Используя следующий очень грубый скрипт Python

from __future__ import print_function
from numpy import loadtxt
import sys

M = loadtxt(sys.argv[1])
print('set object 1 polygon ', end='')
for i in range(0,len(M)):
    if (i == 0):
        print('from {0},{1} '.format(M[i][0], M[i][1]), end='')
    else:
        print('to {0},{1} '.format(M[i][0], M[i][1]), end='')
for i in range(len(M)-1,-1,-1):
    print('to {0},{1} '.format(M[i][0], M[i][2]), end='')

Вы можете построить заполненную кривую с помощью

# determine the autoscaling ranges
set terminal push
set terminal unknown
plot 'test.dat' using 1:2, '' using 1:3
set terminal pop

set xrange [GPVAL_X_MIN:GPVAL_X_MAX]
set yrange [GPVAL_Y_MIN:GPVAL_Y_MAX]
eval(system('python script.py test.dat'))
set object 1 polygon fillstyle solid noborder fillcolor rgb 'red'
plot NaN notitle

Это еще не решает проблему с зазубренной цветовой коробкой :(

person Christoph    schedule 10.07.2015
comment
Спасибо за развернутый ответ. У меня есть комментарий. Действительно ли нам нужен объект? Разве использование сценария для создания такого многоугольника из двух кривых не является несколько более чистым решением, а затем использовать простой график 'crafted-data.dat' u 1: 2 с заполненными кривыми? - person Onturenio; 11.07.2015
comment
Нет, закрашенные кривые всегда разбивают вашу область на четырехугольники. Если я правильно помню, от этого не страдают только кривые с опцией x1 или x2. Правильное построение областей требует изменения внутреннего кода gnuplot. - person Christoph; 11.07.2015
comment
Но рисунок выше (первый) является примером этого, и, похоже, он работает нормально. Я все равно должен попробовать, чтобы подтвердить. Я хотел это сделать, но на этой неделе это было невозможно. Я дам вам знать свой тест. - person Onturenio; 11.07.2015
comment
Если вы видите эти белые линии, это зависит также от зрителя и коэффициента масштабирования. - person Christoph; 11.07.2015
comment
Я попробовал свой эксперимент (i.imgur.com/jdoxeVz.png)). Это те же данные, что и на рисунке выше, но одна кривая (синяя) была построена с u X1:Y1:Y2, а оранжевая с u X1:Y1, но с предварительной обработкой входного файла, так что я заранее создал многоугольник с двумя линиями сценариев оболочки. Из этого я узнал, что Gnuplot использует разные алгоритмы для plot w fc в зависимости от количества столбцов. На самом деле, я бы предположил, что версия с тремя столбцами содержит ошибки и может быть безопасно заменена другой (выполняя внутреннюю конструкцию многоугольника, на которую у меня ушло две строки). - person Onturenio; 12.07.2015
comment
Извините, мой комментарий не поместился в один комментарий. Как вы думаете, стоит ли предлагать это в качестве улучшения команде разработчиков? Или вы предвидите случай, когда замена стандартного алгоритма этим создаст другие проблемы? Я думаю, что внутренняя замена множества квадратов одним многоугольником была бы почти тривиальной и решила бы проблему, которая, кажется, раздражает многих пользователей. - person Onturenio; 12.07.2015