Рисование графиков. Python. Tkinter

Это моя первая статья и я хотел бы рассказать о том как написать простейшую программу по рисованию графиков функций.
Статья ориентирована на новичков!
Начнем с того, что наша функция будет иметь вид:
y = c(x)
Где c(x) — это выражение от одной переменной «x».
Сразу считаем её.

f = input('f(x):')


Считать значение функции мы будем функцией eval().
Подключим нужные нам библиотеки.

from math import *
from tkinter import *
f = input('f(x):')


Теперь надо нарисовать оси координат.

from math import *
from tkinter import *

f = input('f(x):')

root = Tk()

canv = Canvas(root, width = 1000, height = 1000, bg = "lightblue", cursor = "pencil")
canv.create_line(500,1000,500,0,width=2,arrow=LAST) 
canv.create_line(0,500,1000,500,width=2,arrow=LAST) 

canv.pack()	
root.mainloop()



Для пересчета значений функции в разных точках я брал 16000 точек на оси X.
Для каждой из них мы считаем значение «y».
Нарисуем овалы с координатами (x, y, x + 1, y + 1).
Овалы, как вы уже, наверное, поняли, — это просто точки на нашем графике.
Перебираем эти точки.

from math import *
from tkinter import *

f = input('f(x):')

root = Tk()

canv = Canvas(root, width = 1000, height = 1000, bg = "white")
canv.create_line(500,1000,500,0,width=2,arrow=LAST) 
canv.create_line(0,500,1000,500,width=2,arrow=LAST) 

First_x = -500;

for i in range(16000):
	x = First_x + (1 / 16) * i
	new_f = f.replace('x', str(x))
	y = -eval(new_f) + 500
	x += 500
	canv.create_oval(x, y, x + 1, y + 1, fill = 'black')
	 
canv.pack()	
root.mainloop()



Итак, мы уже умеем выводить оси координат и график функции на отрезке от -500 до 500.

Но если мы введем функцию, которая не определена в какой — нибудь из проверяемых точек, или она содержит ошибку, то наша программа вылетит с ошибкой, это не есть здорово.
Для того, чтобы исправить это, усовершенствуем наш код.
И разметим наши оси.
from math import *
from tkinter import *

f = input('f(x):')

root = Tk()

canv = Canvas(root, width = 1000, height = 1000, bg = "white")
canv.create_line(500,1000,500,0,width=2,arrow=LAST) 
canv.create_line(0,500,1000,500,width=2,arrow=LAST) 

First_x = -500;

for i in range(16000):
	if (i % 800 == 0):
		k = First_x + (1 / 16) * i
		canv.create_line(k + 500, -3 + 500, k + 500, 3 + 500, width = 0.5, fill = 'black')
		canv.create_text(k + 515, -10 + 500, text = str(k), fill="purple", font=("Helvectica", "10"))
		if (k != 0):
			canv.create_line(-3 + 500, k + 500, 3 + 500, k + 500, width = 0.5, fill = 'black')
			canv.create_text(20 + 500, k + 500, text = str(k), fill="purple", font=("Helvectica", "10"))
	try:
		x = First_x + (1 / 16) * i
		new_f = f.replace('x', str(x))
		y = -eval(new_f) + 500
		x += 500
		canv.create_oval(x, y, x + 1, y + 1, fill = 'black')
	except:
		pass
canv.pack()	
root.mainloop()


Теперь готово.
Получилась примитивная рисовала графиков.
image
image
image
Метки:
  • +19
  • 57,1k
  • 9
Поделиться публикацией
Похожие публикации
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама
Комментарии 9
  • +1
    Недавно начал строить графики в SciPy + Matplotlib + Python Control Systems Library, очень советую.
    • 0
      Спасибо. Попробую.
      • 0
        видимо ценность больше академическая
        • 0
          конечно.
          • 0
            Ну у Python Control Systems Library да, а вот Matplotlib содержит в себе довольно широкие возможности.
            • 0
              Речь идёт о программе из поста. Подобное следует писать только для самообразования, но не в целях практического использования.
              • 0
                Значит вы промахнулись веткой :)
        • +2
          Понятно, что в статье пример академический и написан с целью научиться-разобраться, а советы «как лучше на практике графики строить» немного не в тему. Но все-же :)

          1) ставим «стек» ipython:

          $ pip install ipython tornado zeromq matplotlib numpy

          2) запускаем ipython notebook (со включенной поддержкой инлайн-графиков):

          $ ipython notebook --pylab=inline

          3) переходим в браузере по адресу 127.0.0.1:8888
          4) тыкаем там «New Notebook»
          5) вбиваем код

          import numpy
          x = numpy.linspace(-20,20,100)
          f = lambda x: x*x + 25*sin(x)
          plot(x, f(x))
          

          6) и жмем Shift-Enter:

          • 0
            pylab исчо
            За статью спасибо.

            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.