Уведомления

Группа в Telegram: @pythonsu

#1 Март 15, 2015 00:27:38

Mazay_Ka
Зарегистрирован: 2013-04-03
Сообщения: 59
Репутация: +  0  -
Профиль   Отправить e-mail  

Mathplot и как вариант

Привет, подскажите что можно сделать.
Есть допустить словарь(dict) у каждого ключа список значений например
у какждого ключа свой список.
Как можно реализовать чтобы допустим был график а над ним список где я могу выбрать каждый ключ из словаря а по значениям этого ключа рисовался график.
Я знаком только с mathplot по части рисования графиком, но как такое сделать там пока не понял, получается только нарисовать много графиков по всем значениям или на одном графике или на разных, а вот как взять так чтобы можно было выбирать и получать гафик в зависимости от выбора я пока не понял.
Подскажи те может на простом примере или хоть куда смотреть в какую сторону.
Спасибо.
Я так понимаю стоит веб приложение написать простейшее где наделать ссылок на каждый ключ и при клике загружать страницу где по значению данного ключа будет график. Это так мысли.

Офлайн

#2 Март 15, 2015 02:12:13

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Mathplot и как вариант

ну вот посмотрите я накидал прмер

import matplotlib
matplotlib.use('TkAgg')
from numpy import arange, sin, pi
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
from matplotlib.backend_bases import key_press_handler
from matplotlib.figure import Figure
import Tkinter as Tk
root = Tk.Tk()
root.wm_title("TEST")
f = Figure()
a = f.add_subplot(111)
d = [0.0,3.0,0.01]
canvas = FigureCanvasTkAgg(f, master=root)
def redraw():
    func([float(i.get()) for i in e])
def func(array):
    t = arange(*array)
    s = sin(2*pi*t)
    a.clear()
    a.plot(t,s)
    canvas.draw()
func(d)
e = []
for j, i in enumerate(d):
    e.append(Tk.Entry(root))
    e[-1].insert(0, str(d[j]))
    e[-1].pack(side=Tk.TOP)
b = Tk.Button(root, text='Ok', command=redraw)
b.pack(side=Tk.TOP)
canvas.get_tk_widget().pack(side=Tk.BOTTOM, fill=Tk.BOTH, expand=1)
Tk.mainloop()



————————————————
-*- Simple is better than complex -*-

Отредактировано terabayt (Март 15, 2015 02:12:33)

Офлайн

#3 Март 15, 2015 02:33:18

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Mathplot и как вариант

получаете от сервера массив json с данными и отрисовываете на JS апликации график. это типичное решение на сегодняшний день - переносить логику на стороне клиента. Я так делал. Работает хорошо. если данные большие то можно через AJAX получать одиночные серии и отрисовывать



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#4 Март 15, 2015 10:57:13

Mazay_Ka
Зарегистрирован: 2013-04-03
Сообщения: 59
Репутация: +  0  -
Профиль   Отправить e-mail  

Mathplot и как вариант

terabayt
ну вот посмотрите я накидал прмер
Спасибо, такой момент у меня больше 50 значений такого плана все разные, это можно в mathplot как выпадающим списком реализовать, то есть выбрать нужный ключ из списка и по его значениям получаем график, просто значение по у, по х их наименования. Данные получаю из базы как вариант их может быть и больше по этому вариант со списком здесь наверно самый практичный

JOHN_16
отрисовываете на JS апликации график
к сожалению я пока с js не так хорошо знаком думал mathplot обойтись

Спасибо всем за советы и помощь.

Офлайн

#5 Март 15, 2015 16:54:11

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Mathplot и как вариант

import matplotlib
matplotlib.use('TkAgg')
from numpy import arange, sin, pi
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
from matplotlib.backend_bases import key_press_handler
from matplotlib.figure import Figure
import Tkinter as Tk
root = Tk.Tk()
root.wm_title("TEST")
f = Figure()
a = f.add_subplot(111)
my_dict = {'a': [0.0,3.0,0.01], 'b': [0.0,5.0,0.1], 'c': [1.0,3.0,0.5]}  # ваш словарь
d = [0.0,3.0,0.01]
canvas = FigureCanvasTkAgg(f, master=root)
def redraw(a):
    func(my_dict[variable.get()])
def func(array):
    t = arange(*array)
    s = sin(2*pi*t)
    a.clear()
    a.plot(t,s)
    canvas.draw()
func(d)
variable = Tk.StringVar(root)
variable.set("Hello")
opt = Tk.OptionMenu(root, variable, *my_dict, command=redraw)
opt.pack(side=Tk.TOP)
canvas.get_tk_widget().pack(side=Tk.BOTTOM, fill=Tk.BOTH, expand=1)
Tk.mainloop()



————————————————
-*- Simple is better than complex -*-

Отредактировано terabayt (Март 15, 2015 16:54:22)

Офлайн

#6 Март 15, 2015 18:03:31

Mazay_Ka
Зарегистрирован: 2013-04-03
Сообщения: 59
Репутация: +  0  -
Профиль   Отправить e-mail  

Mathplot и как вариант

terabayt
Спасибо вы очень помогли, это то то нужно.
Делаю сейчас вариант с pygal и flask чтобы можно было на веб смотреть. Вопрос как вообще правильно и принято делать.
Допустим я зарание прорисовал все графики лежат они на сервере и вызываются при выборе названия из списка отдельно картинка уже нарисованая и просто показывается(если обновлять данные можно заново скрип запустить он добавит и дорисует новые), либо хранить нарисование графики на сервере не надо и рисовать их сразу при вызове функции и отправлять в template(не знаю как это) как вообще правильно будет сделать с точки зрения хорошего тона?))

Офлайн

#7 Март 19, 2015 19:04:07

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Mathplot и как вариант

Mazay_Ka
как вообще правильно будет сделать
Очень приближенно есть 4 критерия. Загруженность сервера(на перерисовку картинок) и время отклика у пользователя (пересылка картинок и их перегенерация займет время), сложность разработки, требования к дизайну графиков. Если делаете для себя делаейте как проще!
Определитесь с важностью этих пунктов, тогда можно будет говорить о том как правильно. В большинстве крупных проектов отрисовка идет у клиента при помощи js. Питон только отдает данные.

Преимуществ у pygal по сравнению с matplotlib думаю практически нет. matplotlib тоже может создать svg. А качество картинки дает лучше.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version