Публичный номер: время программирования на 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. Установите основные элементы
Основные элементы здесь следующие:
- Цвет, толщина и стиль линии
- Галочки и метки
- Есть и легенды
Код относительно прост, и в основном он был рассмотрен в моей первой лекции.
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()