Создание графики с PyPlot — wxPython #38

автор

Некоторые люди лучше усваивают информацию посредством практических занятий, а кому-то проще иметь визуальную симуляцию в качестве наглядного материала. По крайней мере, нам это постоянно говорят исследователи. Так что, в духе моих прошлых статей, я решил проверить, как хорошо вы усвоили мои уроки, и перейти к визуальной части уравнения, рассказав вам о том, как делать графики с помощью wxPython.

Вы могли этого не знать, но в wxPython для этого даже предусмотрен специальный виджет. Он называется PyPlot. Испольузя PyPlot вы сможете создавать графики быстро и просто! Если вам нужны какие странные и сложные диаграммы, я рекомендовал бы использовать вместо него matplotlib. К счастью, wxPython и matplotlib отлично взаимодействуют друг с другом, но мы не будем уделять внимания matplotlib в данной статье.

Учтите: примеры в данной статье не работают в wxPython 3.0.2.0 Classic, так как в нём есть известный баг (http://trac.wxwidgets.org/ticket/16767).

Приступая к работе (со столбиковой диаграммой!)

Если вы взглянете на файл plot.py в дистрибутиве wxPython, вы заметите, что PyPlot требует Numeric, numarray или numpy (в порядке убывания), так что установите хотя бы одного из них, чтобы использовать этот виджет. Чтобы установить numpy вы можете использовать pip, что значительно упростит вам задачу:

В любом случае, в самом низу файла plot.py есть простое демо, показывающее как можно делать графики, используя виджет PyPlot. Давайте взглянем на фрагмент его кода и выясним, каков спектр наших возможностей:

Функция drawBarGraph были извлечена прямо из файла plot.py, о котором я упоминал ранее. В данном примере, имя этой функции было изменено с «_draw6Objects» на «drawBarGraph», чтобы было проще следовать этому коду. Давайте взглянем на неё. Точками являются точки нашего графика [(x1, y1), (x2, y2)].

Они сообщают PyPlot где чертить, используя метод PolyLine. Как вы видите, PolyLine берёт список кортежей точек графика и, опционально, цвет, легенду, ширину и стиль (не отображено). Мы создаём серию PolyLines и затем добавляем её в инстанцию PlotGraphics. Первым методом PlotGraphics является список PolyLines (или других PolyXXX объектов), заголовок xLabel и yLabel. Затем вы возвращаем объект PlotGraphics назад к вызывающему, который располагается в нашем классе wxPython.

Теперь мы возвращаем наше внимание к тому классу, который ласково назвали MyGraph. Первые пару строк кода будут знакомы любому, кто уже использовал wxPython ранее, так что давайте их пропустим и сразу перейдём к той части, где создаётся виджет. Здесь мы видим, как создать PlotCanvas используя лишь пустую wx.Panel в качестве его перента.

Чтобы нарисовать столбиковую диаграмму, мы вызываем метод нашего объекта холста, который называется Draw, проводим его через объект, который был возвращён из функции drawBarGraph. Не стесняйтесь прочитать это несколько раз, чтобы понять, что произошло, так понимание этого процесса крайне важно для того, что я собираюсь рассказать дальше.

Вы готовы? Теперь давайте продолжим! После того, как мы нарисовали столбиковую диаграмму, мы создаём несколько чекбоксов, позволяющих нам переключатся между сеткой диаграммы и её легендой. Затем мы размещаем виджеты в рамке. Названия методов check box говорят сами за себя, так что вам стоит разобраться с тем, что они делает самостоятельно. Подсказка IsChecked() возвращает Boolean.

Рисуем диаграммы, используя сохранённые данные

Нормально, то что вы предпочтёт использовать сохранённые данные, базу данных или веб-сервис, а не вписывать их каждый раз в код вручную. В данной части мы рассмотрим, как нарисовать диаграмму, используя сохранённые данные. Вот данные, которые мы будем использовать (вы скорее всего захотите загрузить архивы в виде исходного кода с Github):

http://www.wunderground.com/history/airport/KMIW/2010/9/22/WeeklyHistory.html?format=1

КИПА КОПИПАСТА, не думаю, что вы захотите платить за неё)

Первая строчка – это вебсайт, вторая говорит нам о том, какие запятые означают переход на следующую строку. Остальные строки – это чистые данные, содержащие немного HTML-мусора в конце каждой строки. Последняя строка также содержит информацию, которую мы проигнорируем. А теперь давайте напишем код, превращающий эти данные в диаграмму!

Вы поняли, что делает этот код? Ладно, если вы не можете (или не хотите) понимать, то вы можете прочесть об этом прямо сейчас. Точно так же, как и в предыдущем примере, мы импортируем кое-что и создаём wx.Frame, содержащий панель и PlotCanvas. Мы используем простой метод readFile и более сложный, под названием createPlotGraphics. Именно на этих двух методах мы и сфокусируемся.

Метод readFile вызывается методом createPlotGraphics. Всё, что он делает – считывает файл. В данном примере, путь к этому файлу вписан прямо в код. Скорее всего вы захотите использовать что-то вроде бразуера для загрузки файла, но мы пойдём по супер-простому пути. Когда мы считываем линии из файла, мы пропускаем первые две строки, используя следующий синтаксис:

Всё, что он делает это считывает весь файл, исключая первые две строки и последнюю. Таким образом мы избавляемся от мусора в начала и конце файла. Ну разве Python не крут? Затем мы создаём простой «for loop», мы извлекаем только данные, которые нам нужны, а именно день, высокую и низкую температуры. Остальное мы просто отбрасываем.

В методе createPlotGraphics мы берём список температур, возвращённый нам из метода readFile и запускаем с ним цикл, создавая новый список PolyLines. Мы используем несколько условных выражений, чтобы решить, какого цвета сделать каждый столбик в диаграмме. Наконец, мы перемещаем все PolyLines в инстанцию PlotGraphics, и возвращаем её к вызванному в методе __init__. Вот и всё!

Точечный график с тысячами точек

Теперь, мы собираемся создать точечную диаграмму, состоящую из 25 тысяч точек! Она также взята из демо-пакета. Вот код:

Мы повторно использовали большую часть wxPython кода из первоначального примера и просто вызвали другую функцию. Функция drawLinePlot довольно проста. Например, мы используем numpy, чтобы создать график, содержащий 25 тысяч точек, а затем создаём PolyLine с ними. Если вы увеличите изображение, то увидите, что некоторые точки квадратные, а не круглые. Для этого нам и нужен был класс PolyMarker. Он задаёт класс «маркера». Теперь вы готовы взглянуть на следующий пример!

Создаём синусный/косинусный график

Данный пример показывает, как взять синус и косину, а затем превратить их в диаграмму.  Вон выглядит как двойная спираль, расположенная горизонтально. В любом случае: вот код.

Данный пример для тех, кто хорошо разбирается в математике. Я не занимался тригонометрией или геометрией уже довольно давно, так что я не смогу объяснить вам, что эта диаграмма выражает. Вы можете выяснить это, используя вашу любимую поисковую систему. Данный пример использует одну PolyLine и два PolyMarkers, чтобы создать график. Здесь всё так же, как и в прошлых примерах, так что добавить мне особо нечего.

Итоги

Теперь вы должны быть более чем готовы к самостоятельному созданию графиков с использованием wxPython. Если у вас возникнут трудности, то есть несколько примеров в файле plot.py, а также люди, находящиеся в записной книжке wxPython довольно дружелюбны, так что вы наверняка получите помощь, если вежливо о ней попросите. Дайте мне знать, если создадите что-то крутое!

Вам может быть интересно

Scroll Up