Python繪製正餘弦函數圖像

公衆號:Python編程時光python

今天打算經過繪製正弦和餘弦函數,從默認的設置開始,一步一步地調整改進,讓它變得好看,變成咱們初高中學習過的圖象那樣。經過這個過程來學習如何進行對圖表的一些元素的進行調整。編程

01. 簡單繪圖

matplotlib有一套容許定製各類屬性的默認設置。你能夠幾乎控制matplotlib中的每個默認屬性:圖像大小,每英寸點數,線寬,色彩和樣式,子圖(axes),座標軸和網格屬性,文字和字體屬性,等等。函數

雖然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. 設置基本元素

這邊的基本元素主要有幾下幾點:spa

  1. 線的顏色,粗細,和線型
  2. 刻度和標籤
  3. 還有圖例

代碼比較簡單,基本上在個人第一講內容裏都講過了。3d

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 code

03. 移動軸線

還記得咱們在初高中學習的三角函數圖象,可不是這樣,它應該是有四個象限的。而這裏倒是一個四四方方的圖表。cdn

因此接下來,咱們要作的就是移動軸線,讓它變成咱們熟悉的樣子。blog

咱們只須要兩軸線(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()這個函數中的data是啥意思?我查了下官網。解釋以下

而後最後發現,上面的寫法能夠用必定更簡潔的方式設置,是等價的。

ax.spines['bottom'].set_position('zero')
ax.spines['left'].set_position('zero')
複製代碼

show image

04. 添加註釋

如今的圖形部分已經成型,接下讓咱們如今使用annotate命令註解一些咱們感興趣的點。

咱們選擇2π/3做爲咱們想要註解的正弦和餘弦值。咱們將在曲線上作一個標記和一個垂直的虛線。而後,使用annotate命令來顯示一個箭頭和一些文本。

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,指定類型,data 是說基於數值來定位; 第四個參數,xytext,是註釋的位置,結合第五個參數,就是根據偏移量來決定註釋位置; 第五個參數,textcoords,值爲offset points,就是說是相對位置; 第六個參數,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()
複製代碼

相關文章
相關標籤/搜索