Python рисует график функций синуса и косинуса

искусственный интеллект Python

Публичный номер: время программирования на Python

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

01. Простой рисунок

matplotlib имеет набор настроек по умолчанию, которые позволяют настраивать различные свойства. Вы можете контролировать почти каждое свойство по умолчанию в matplotlib: размер изображения, количество точек на дюйм, ширину линии, цвет и стиль, подграфики (оси), свойства осей и сетки, свойства текста и шрифта и многое другое.

Хотя в большинстве случаев настройки matplotlib по умолчанию довольно хороши, в некоторых особых случаях вы можете изменить некоторые свойства.

from pylab import *

x = np.linspace(-np.pi, np.pi, 256,endpoint=True)
C,S = np.cos(x), np.sin(x)

plot(x,C)
plot(x,S)

show()

show image

02. Установите основные элементы

Основные элементы здесь следующие:

  1. Цвет, толщина и стиль линии
  2. Галочки и метки
  3. Есть и легенды

Код относительно прост, и в основном он был рассмотрен в моей первой лекции.

import numpy as np
from matplotlib import pyplot as plt

plt.figure(figsize=(10,6), dpi=80)
x = np.linspace(-np.pi, np.pi, 256,endpoint=True)
C,S = np.cos(x), np.sin(x)

# 设置线的颜色,粗细,和线型
plt.plot(x, C, color="blue", linewidth=2.5, linestyle="-", label=r'$sin(x)$')
plt.plot(x, S, color="red",  linewidth=2.5, linestyle="-", label=r'$cos(x)$')

# 如果觉得线条离边界太近了,可以加大距离
plt.xlim(x.min()*1.2, x.max()*1.2)
plt.ylim(C.min()*1.2, C.max()*1.2)

# 当前的刻度并不清晰,需要重新设定,并加上更直观的标签
plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi],
          [r'$-\pi$', r'$-\pi/2$', r'$0$', r'$+\pi/2$', r'$+\pi$'])
plt.yticks([-1,0,1],
          [r'$-1$', r'$0$', r'$1$'])

# 添加图例
plt.legend()

plt.show()

show image

03. Переместите ось

Помните тригонометрические графики, которые мы изучали в средней и старшей школе, но это не так, у них должно быть четыре квадранта. А вот квадратная диаграмма.

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

Нам нужны только две оси (x и y), поэтому нам нужно скрыть верхнюю и правую оси (установите цвет None).

# plt.gca(),全称是get current axis
ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')

# 由于我们移动的是左边和底部的轴,所以不用设置这两个也可以
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')

# 指定data类型,就是移动到指定数值
ax.spines['bottom'].set_position(('data',0))
ax.spines['left'].set_position(('data',0))

оset_position()Что означают данные в этой функции? Я проверил официальный сайт. объясняется следующим образом

Потом, наконец, обнаружил, что описанный выше способ написания можно задать в некотором более лаконичном виде, что эквивалентно.

ax.spines['bottom'].set_position('zero')
ax.spines['left'].set_position('zero')

show image

04. Добавляйте заметки

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

Мы выбираем2π/3как значения синуса и косинуса, которые мы хотим аннотировать. Сделаем маркер и вертикальную пунктирную линию на кривой. Затем используйте команду аннотации, чтобы отобразить стрелку и некоторый текст.

t = 2*np.pi/3

# 利用plt.plot绘制向下的一条垂直的线,利用plt.scatter绘制一个点。
plt.plot([t,t],[0,np.cos(t)], color ='blue', linewidth=2.5, linestyle="--")
plt.scatter([t,],[np.cos(t),], 50, color ='blue')

plt.annotate(r'$sin(\frac{2\pi}{3})=\frac{\sqrt{3}}{2}$',
         xy=(t, np.sin(t)), xycoords='data',
         xytext=(+10, +30), textcoords='offset points', fontsize=16,
         arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2"))

# 利用plt.plot绘制向上的一条垂直的线,利用plt.scatter绘制一个点。
plt.plot([t,t],[0,np.sin(t)], color ='red', linewidth=2.5, linestyle="--")
plt.scatter([t,],[np.sin(t),], 50, color ='red')

plt.annotate(r'$cos(\frac{2\pi}{3})=-\frac{1}{2}$',
         xy=(t, np.cos(t)), xycoords='data',
         xytext=(-90, -50), textcoords='offset points', fontsize=16,
         arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2"))

Здесь вы можетеplt.annotateИспользование этой функции незнакомо. Объясните и здесь.

Первый параметр — это содержание комментария; второй параметр,xy, который должен аннотировать точку; Третий параметр,xycoords, укажите тип, данные означают поиск на основе значения; четвертый параметр,xytext, — положение аннотации, в сочетании с пятым параметром — для определения положения аннотации в соответствии со смещением; Пятый параметр,textcoords, значение — точки смещения, то есть относительное положение; Шестой параметр,fontsize, размер аннотации; Седьмой параметр,arrowprops, некоторые настройки типа стрелки.

show image

05. Полный код

Выше приведено объяснение кода фрагмента, вот полный код

import numpy as np
from matplotlib import pyplot as plt

plt.figure(figsize=(10,6), dpi=80)
x = np.linspace(-np.pi, np.pi, 256,endpoint=True)
C,S = np.cos(x), np.sin(x)

# 设置线的颜色,粗细,和线型
plt.plot(x, C, color="blue", linewidth=2.5, linestyle="-", label=r'$sin(x)$')
plt.plot(x, S, color="red",  linewidth=2.5, linestyle="-", label=r'$cos(x)$')

# 如果觉得线条离边界太近了,可以加大距离
plt.xlim(x.min()*1.2, x.max()*1.2)
plt.ylim(C.min()*1.2, C.max()*1.2)

# 当前的刻度并不清晰,需要重新设定,并加上更直观的标签
plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi],
          [r'$-\pi$', r'$-\pi/2$', r'$0$', r'$+\pi/2$', r'$+\pi$'])
plt.yticks([-1,1],
          [r'$-1$', r'$1$'])

# 添加图例
plt.legend(loc='upper left')

# plt.gca(),全称是get current axis
ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')

# 由于我们移动的是左边和底部的轴,所以不用设置这两个也可以
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')

# 指定data类型,就是移动到指定数值
# ax.spines['bottom'].set_position('zero')
ax.spines['bottom'].set_position(('data',0))
ax.spines['left'].set_position(('data',0))

t = 2*np.pi/3

# 利用plt.plot绘制向下的一条垂直的线,利用plt.scatter绘制一个点。
plt.plot([t,t],[0,np.cos(t)], color ='blue', linewidth=2.5, linestyle="--")
plt.scatter([t,],[np.cos(t),], 50, color ='blue')

plt.annotate(r'$sin(\frac{2\pi}{3})=\frac{\sqrt{3}}{2}$',
         xy=(t, np.sin(t)), xycoords='data',
         xytext=(+10, +30), textcoords='offset points', fontsize=16,
         arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2"))

# 利用plt.plot绘制向上的一条垂直的线,利用plt.scatter绘制一个点。
plt.plot([t,t],[0,np.sin(t)], color ='red', linewidth=2.5, linestyle="--")
plt.scatter([t,],[np.sin(t),], 50, color ='red')

plt.annotate(r'$cos(\frac{2\pi}{3})=-\frac{1}{2}$',
         xy=(t, np.cos(t)), xycoords='data',
         xytext=(-90, -50), textcoords='offset points', fontsize=16,
         arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2"))

plt.show()