Original:http://alumni.cs.ucr.edu/~titus/pyxTutorial/

Учебник Titus PyX для пользователей Gnuplot

Автор: Titus Winters

Переводы: Белорусский

Примечание. В этом учебнике предполагается, что вы знакомы с языком Gnuplot и Python . Без какого-либо понимания этих проблем вы будете потеряны.

В какой-то момент это обязательно произойдет. Gnuplot замечательный, но наступает время, когда у него просто нет достаточной силы, необходимой для этого. Возможно, вы хотите радикально изменить способ рисования осей. Возможно, вы просто хотите сделать что-то простое, как изменить цвет сюжетной линии, но не шаблон. Возможно, вам действительно нужны некоторые грамотные математические символы, отображаемые на графике. В какой-то момент вы попадете в стену, за которой Gnuplot быстро перестает быть правильным ответом. Что лучше работает в этих ситуациях?

Есть много ответов. HippoDraw является мощным и бесплатным, хотя и относительно неизвестным. Некоторым людям нравится XGraph . Если вы, как и я, являетесь программистом на Python, тогда вы, возможно, захотите пойти на менее удобное для пользователя, но более управляемое решение. Если это так, то PyX (произносится как «Piks») - одна из возможностей.

На момент написания этой статьи (январь 2006 года) PyX по-прежнему является предварительным выпуском программного обеспечения. Рекламируя версию 0.8.1, на этом есть определенные черты. Использование PyX вполне может потребовать значительных выкупов на объектах Python, которые составляют структуру PyX. Тем не менее, я могу подтвердить, что это время потрачено: потребовалось около 3-4 часов, чтобы перейти от установки PyX к генерации графиков, которые (по моему мнению) значительно превосходили то, что я мог бы получить из Gnuplot, - для графического отображения.

Содержание

Основное использование
Несколько участков
Стили сюжета
Бары ошибок
Этикетки и весы осей
Графические заголовки
Функции построения
Заключительные примечания

Основное использование

Вероятно, наиболее распространенной задачей Gnuplot является построение простого файла данных. (Примеры файлов данных доступны здесь и здесь ).
gnuplot> plot "data.dat"
График, созданный Gnuplot
Как мы выполняем эквивалент в PyX? Это зависит от того, насколько вы хотите быть эквивалентом: значения по умолчанию в этих двух средах разные. Итак, сначала мы покажем самый простой граф для того же, что и в PyX, а затем следуем за тем, чтобы график выглядел как эквивалент Gnuplot.
from pyx import *

g = graph.graphxy(width=8)
g.plot(graph.data.file("data.dat", x=1, y=2))
g.writePDFfile("test")
График, созданный PyX
Примечание. PyX не имеет возможностей отображения, поэтому вам нужно будет писать в PDF или EPS, а затем использовать любимый просмотрщик для этих форматов файлов.

Существуют три основных различия между этими двумя графиками:
  1. Цвет - Gnuplot по умолчанию печатает первый график в красном цвете, второй - зеленый и т. Д. (Кстати: это неудачно для ~ 3% населения, которое имеет красный-зеленый цвет). PyX по умолчанию - черно-белое.
  2. Ключ. По умолчанию Gnuplot отображает ключ для каждой строки на графике, PyX этого не делает.
  3. Размер изображения - Gnuplot по умолчанию использует старые разрешения монитора компьютера, такие как 640x480 с соотношением 1.33: 1. PyX по умолчанию имеет холсты с золотым соотношением ~ 1.618: 1. (Это, скорее всего, будет менее важным для большинства, но я включаю его для полноты.)
Теперь мы рассмотрим их по одному.

ключ

Добавление ключа очень просто. Просто попросите объект graphxy включить его:
from pyx import *

g = graph.graphxy(width=8, key=graph.key.key())
g.plot(graph.data.file("data.dat", x=1,y=2))
g.writePDFfile("test")
График, созданный PyX с ключом по умолчанию
По правде говоря, маловероятно, что вам нужен заголовок по умолчанию для строки данных, которая предоставляется в таком графике. Установка заголовка в gnuplot будет:
gnuplot> plot "data.dat" title "My Data"
Аналогично в PyX:
from pyx import *

g = graph.graphxy(width=8, key=graph.key.key())
g.plot(graph.data.file("data.dat", x=1, y=2, title="My Data"))
g.writePDFfile("test")
График, созданный PyX с настраиваемым ключом
Примечание. Текст в PyX набирается с помощью LaTeX. Это имеет свои преимущества и недостатки. Если вы хотите, чтобы ваш заголовок включал математические символы, греческие символы и т. Д., Просто введите правильную формулу LaTeX. С другой стороны, если вы хотите использовать знак «%», будьте осторожны: это комментарий в LaTeX, и, таким образом, вы столкнетесь с некоторой значительной путаницей с PyX. Другое дело, что Python может неправильно интерпретировать символы LaTeX: «\ tau» в Python будет интерпретироваться как «\ t» (символ табуляции), за которым следует «au». Хорошим решением для этого является функция «raw string» в Python: предисловие к вашим строкам с помощью «r»: r «\ tau», тогда не будет выполняться расширение escape-символа.

соотношение

Если вы действительно хотите, чтобы соотношение вашего графика диктовалось разрешениями монитора от 90-х годов, а не греческой архитектурой, вам нужно изменить отношение объекта графика. (Я предлагаю оставить по умолчанию.)
from pyx import *

g = graph.graphxy(width=8, ratio=4./3, key=graph.key.key())
g.plot(graph.data.file("data.dat", x=1, y=2, title="My Data"))
g.writePDFfile("test")
График, созданный PyX с измененным отношением

цвет

Изменение цвета фактически изменяет стиль сюжета. Настройка, которая наиболее точно имитирует значения по умолчанию Gnuplot, выглядит примерно так:
from pyx import *

g = graph.graphxy(width=8, ratio=4./3, key=graph.key.key())
g.plot(graph.data.file("data.dat", x=1, y=2, title="My Data"),
       styles=[graph.style.symbol(symbolattrs=[color.gradient.Rainbow])])
g.writePDFfile("test")
График, созданный PyX с цветом
Здесь мы предоставляем список стилей. Стили - это специальные объекты для PyX, найденные в графическом модуле. (Использование dir и help из командной строки Python может быть очень поучительным здесь.) В этом случае единственное, что мы предоставляем, это инструкция по использованию символов. Конструктор для символа может принимать именованный аргумент, symbolattrs , который снова принимает список атрибутов, которые могут использоваться для изменения отображения символа. В этом случае мы предоставляем объект градиента . Задача градиентного объекта - вернуть цвет для рисования следующей строки. Большинство градиентов - это простой двухцветный градиент (сделайте dir () на color.gradient, чтобы просмотреть предопределенные параметры), но Rainbow немного сложнее, чем это , и дает результаты в более разнообразных цветах. Он не будет полностью имитировать цветные варианты Gnuplot, но это действительно неплохо. (Я имею в виду действительно: 6-й цвет в Gnuplot желтый?)

Несколько участков

Хорошо, так что мы можем имитировать простой графический график Gnuplot с одним графиком. Переход на несколько графиков.
gnuplot> plot "data.dat" title "Data 1", "data2.dat" title "Data 2"
Два графика графика, созданных Gnuplot
Множество графиков в PyX эквивалентно просто:
from pyx import *

# Initialize graph object
g = graph.graphxy(width=8, ratio=4./3, key=graph.key.key())

# These are the data lines we want to plot.  
data = [graph.data.file("data.dat", x=1, y=2, title="Data 1"),
        graph.data.file("data2.dat", x=1, y=2, title ="Data 2")]

# Plot it 
g.plot(data,
       styles=[graph.style.symbol(symbolattrs=[color.gradient.Rainbow])])

# Write the output
g.writePDFfile("test")
Многострочный график, созданный PyX

Стили сюжетов

Как насчет изменения стилей сюжета от точек до линий или линий?
gnuplot> plot "data.dat" title "Data 1" with lines, "data2.dat" title "Data 2" with linespoints 
Два графика графика, созданных Gnuplot
Это становится немного сложнее, но не так уж плохо. Мы возвращаемся к построению одной строки за раз. Это не самый простой вызов для этого (я добавляю несколько дополнительных опций), но я пользуюсь этой возможностью, чтобы показать некоторые дополнительные функции, от которых вы должны быть способны обобщить.
 
from pyx import *

# Initialize graph object
g = graph.graphxy(width=8, ratio=4./3, key=graph.key.key())

# Plot the first line
g.plot(graph.data.file("data.dat", x=1, y=2, title="Data 1"),
       styles=[graph.style.line([color.rgb.red,
                                 style.linestyle.solid,
                                 style.linewidth.thick])])

# Plot the second line
g.plot(graph.data.file("data2.dat", x=1, y=2, title ="Data 2"),
       styles=[graph.style.line([color.rgb.green,
                                 style.linestyle.solid,
                                 style.linewidth.thick]),
               graph.style.symbol(symbolattrs=[color.rgb.green])])

# Write the output
g.writePDFfile("test")
Многострочный график, созданный PyX

Бары ошибок

Добавление баров ошибок в PyX довольно просто и дает вам гораздо больший контроль над тем, как рисуются точки (с символами или без символов, разными полосами ошибок по сравнению с символами, размером символа и т. Д.).

Этот раздел использует это как файл данных.
plot "error.dat" using 1:2:3 with yerrorbars title "Samples"
График Gnuplot с ошибками
from pyx import *

g = graph.graphxy(width=8)

g.plot(graph.data.file("error.dat", x=1, y=2, dy=3),
       styles=[graph.style.errorbar(errorbarattrs=[color.rgb.red]),
               graph.style.symbol(graph.style.symbol.circle, size=0.05,
                                  symbolattrs=[color.rgb.red])])

g.writePDFfile("test.pdf")
Рисунок с ошибками, сгенерированными в PyX

Этикетки и весы осей

Опять же, общие и простые функции в Gnuplot, которые оказались почти такими же легкими в PyX. Давайте добавим метки к нашим графикам, чтобы мы знали, что представляют собой оси.
gnuplot> set ylabel "# Roaches"
gnuplot> set xlabel "Time (days)"
gnuplot> plot "data.dat" title "Data 1" with lines, "data2.dat" title "Data 2" with linespoints 
Два графика графика, созданных Gnuplot
И эквивалент в PyX. Единственное, на что можно обратить внимание, это призывы к LaTeX.
 
from pyx import *

# Initialize graph object
g = graph.graphxy(width=8, ratio=4./3, key=graph.key.key(),
                  x=graph.axis.linear(title="Time (days)"),
      y=graph.axis.linear(title="$\#$ Roaches"))

# Plot the first line
g.plot(graph.data.file("data.dat", x=1, y=2, title="Data 1"),
       styles=[graph.style.line([color.rgb.red,
                                 style.linestyle.solid,
                                 style.linewidth.thick])])

# Plot the second line
g.plot(graph.data.file("data2.dat", x=1, y=2, title ="Data 2"),
       styles=[graph.style.line([color.rgb.green,
                                 style.linestyle.solid,
                                 style.linewidth.thick]),
               graph.style.symbol(symbolattrs=[color.rgb.green])])

# Write the output
g.writePDFfile("test")
Многострочный график, созданный PyX
Как насчет того, хотим ли мы немного поднять диапазоны для участков?
gnuplot> set ylabel "# Roaches"
gnuplot> set xlabel "Time (days)"
gnuplot> set xrange [0 to 35]
gnuplot> set yrange [0 to 105]
gnuplot> plot "data.dat" title "Data 1" with lines, "data2.dat" title "Data 2" with linespoints 
Два графика графика, созданных Gnuplot
Опять же, в PyX, очень легко.
 
from pyx import *

# Initialize graph object
g = graph.graphxy(width=8, ratio=4./3, key=graph.key.key(),
                  x=graph.axis.linear(min=0, max=35, title="Time (days)"),
      y=graph.axis.linear(min=0, max=105, title="$\#$ Roaches"))

# Plot the first line
g.plot(graph.data.file("data.dat", x=1, y=2, title="Data 1"),
       styles=[graph.style.line([color.rgb.red,
                                 style.linestyle.solid,
                                 style.linewidth.thick])])

# Plot the second line
g.plot(graph.data.file("data2.dat", x=1, y=2, title ="Data 2"),
       styles=[graph.style.line([color.rgb.green,
                                 style.linestyle.solid,
                                 style.linewidth.thick]),
               graph.style.symbol(symbolattrs=[color.rgb.green])])

# Write the output
g.writePDFfile("test")
Многострочный график, созданный PyX

Графические заголовки

Определенно один из наименее элегантных эквивалентов Gnuplot для PyX, добавление заголовка в график фактически использует возможность PyX для добавления текста в любом месте графика. Не нравится ключ по умолчанию? Сделайте новый. Хотите добавить ярлыки прямо на график? Сделай это. Не хотите ли вертикальный текст для y-метки? Сделайте это вручную. Возможность набирать текст прямо на ваш график может быть очень удобной, но это связано с ценой: время от времени она немного неуклюжая.
gnuplot> set ylabel "# Roaches"
gnuplot> set xlabel "Time (days)"
gnuplot> set xrange [0 to 35]
gnuplot> set yrange [0 to 105]
gnuplot> set title "Effectiveness of Brand X Roach Bait"
gnuplot> plot "data.dat" title "Data 1" with lines, "data2.dat" title "Data 2" with linespoints 
Два графика графика, созданных Gnuplot
 
from pyx import *

# Initialize graph object
g = graph.graphxy(width=8, ratio=4./3, key=graph.key.key(),
                  x=graph.axis.linear(min=0, max=35, title="Time (days)"),
      y=graph.axis.linear(min=0, max=105, title="$\#$ Roaches"))

# Plot the first line
g.plot(graph.data.file("data.dat", x=1, y=2, title="Data 1"),
       styles=[graph.style.line([color.rgb.red,
                                 style.linestyle.solid,
                                 style.linewidth.thick])])

# Plot the second line
g.plot(graph.data.file("data2.dat", x=1, y=2, title ="Data 2"),
       styles=[graph.style.line([color.rgb.green,
                                 style.linestyle.solid,
                                 style.linewidth.thick]),
               graph.style.symbol(symbolattrs=[color.rgb.green])])

# Now plot the text, horizontally centered 
g.text(g.width/2, g.height + 0.2, "Effectiveness of Brand X Roach Bait", 
       [text.halign.center, text.valign.bottom, text.size.Large])

# Write the output
g.writePDFfile("test")
Многострочный график, созданный PyX

Функции построения

Одним из примеров, который предоставил читатель, были графические точки, определенные файлом, но функционально модифицированные . Например, в Gnuplot:
plot "data.dat" title "Data 1" with lines title "Data 1"
Графический график графика, созданный Gnuplot
И это примерно то же самое в PyX (благодаря Kipton Barros для подсказки):
from pyx import *

# Initialize graph object
g = graph.graphxy(width=8, ratio=4./3, key=graph.key.key())
g.plot(graph.data.file("data.dat", x=1, y="$2/2", title="Data 1"),
       styles=[graph.style.line([color.rgb.red,
                                 style.linestyle.solid,
                                 style.linewidth.thick])])
g.writePDFfile("test")
Графический график графика, созданный PyX


Другим распространенным применением Gnuplot является построение функции, будь то чисто математическая или наилучшая для ваших данных. (Стоит отметить, что PyX не может заменить «пригодные» возможности Gnuplot, если вы работаете с функциями наилучшего соответствия.)
set xrange [0:10]
set yrange [0:10]

f(x) = .2 * x**2 - x + 1
plot f(x)
Парабола, построенная Гнуплотом
Эквивалент в PyX прост, если вы следите за ним, хотя, конечно, больше набираете текст.
from pyx import *

# Initialize graph object
g = graph.graphxy(width=8,
                  key=graph.key.key(),
                  x=graph.axis.linear(min=0, max=10),
                  y=graph.axis.linear(min=0, max=10))

# Plot the function
g.plot(graph.data.function("y(x) = .2 * x**2 - x + 1"),
       styles=[graph.style.line([color.rgb.red,
                                 style.linestyle.solid,
                                 style.linewidth.thick])])

# Write pdf
g.writePDFfile("test.pdf")
Парабола, построенная PyX
Как насчет параметрических сюжетов?
set parametric

set xrange[-5:5]
set yrange[-5:5]
set trange[0:10]
unset key

x(t) = cos(t) * t**.5
y(t) = sin(t) * t**.5

plot x(t),y(t)
Спираль в Гнубло
В PyX мы начинаем видеть некоторые возможности Python.
import math

def x(k):
    return math.cos(k) * k**.5

def y(k):
    return math.sin(k) * k**.5

# Initialize graph object
g = graph.graphxy(width=8,
                  x=graph.axis.linear(min=-5, max=5),
                  y=graph.axis.linear(min=-5, max=5))


# Plot the function
kMin = 0
kMax = 10

# The "context" parameter is a Python context, allowing us
# to use functions locally defined in this function. OR
# we can make the string "x, y = x(k), y(k)" into a more complex
# Python expression (it is being passed to eval() under the hood.)
g.plot(graph.data.paramfunction("k", kMin, kMax,
                                "x, y = x(k), y(k)",
                                context=locals()),
       styles=[graph.style.line([color.rgb.red,
                                 style.linestyle.solid,
                                 style.linewidth.thick])])

# Write pdf
g.writePDFfile("test.pdf")
Параметрическая функция в PyX
Или как насчет того, что Gnuplot не может сделать: несколько параметрических кривых с разными диапазонами? (Gnuplot допускает только один диапазон для параметрического значения t за раз, поэтому все отображаемые функции должны быть записаны с учетом того же диапазона. PyX не имеет такого ограничения).
import math

def x(k):
    return math.cos(k) * k**.5

def y(k):
    return math.sin(k) * k**.5

# Initialize graph object
g = graph.graphxy(width=8,
                  x=graph.axis.linear(min=-5, max=5),
                  y=graph.axis.linear(min=-5, max=5))


# Plot the function
kMin = 0
kMax = 10
g.plot([graph.data.paramfunction("k", kMin, kMax,
                                 "x, y = x(k), y(k)",
                                 context=locals()),
        graph.data.paramfunction("k", 0, 20,
                                 "x, y = 3+x(k), 1-y(k)",
                                 context=locals())],
       styles=[graph.style.line([color.gradient.RedBlue,
                                 style.linestyle.solid,
                                 style.linewidth.thick])])


# Write pdf
g.writePDFfile("test.pdf")
Функции с различными параметрическими диапазонами в PyX
При достаточном линейном масштабировании параметрического значения Gnuplot можно было бы уговорить построить график, подобный приведенному выше.

Заключительные примечания

Ну, это примерно так для базового использования Gnuplot. С другой стороны, это едва царапает поверхность PyX. С предоставленными демонстрациями вы должны с легкостью преобразовать любые ваши старые сюжеты Gnuplot в блестящие новые графики PyX и, вероятно, сделать их намного приятнее в этом процессе. Одним из основных преимуществ здесь является то, что PyX - это действительно Python, и вы можете (и должны!) Писать функции, циклы, условные обозначения и т. Д. При работе с большими задачами построения графиков. Таким образом, вы можете значительно уменьшить количество кода, необходимого для генерации ваших графиков. Кроме того, PyX дает вам гораздо большую свободу для изменения стилей линий, осей и т. Д. Маркировка - это мощная функция. Потратьте время, чтобы изучить PyX (к сожалению, интерпретатор Python - это лучший способ сделать это), и посмотрите, какие новые применения вы можете придумать, чтобы вы никогда не пробовали Gnuplot.