天天看點

cp9_3_1.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @File  : cp9_3_1.py
# @Author: WRH
# @Date  : 2021/6/7
# @Edition:Python3.8.6

# 9.3  matplotlib庫的圖形繪制方法
'''
matplotlib庫是用于科學計算資料可視化的常見Python第三方子產品。
它借鑒了許多Matlab中的函數,可以輕松繪制高品質的線條圖、直方圖、餅圖、散點圖及誤差線圖等二維圖形,也可以繪制三維圖像,
還可以友善地設定圖形線條的類型、顔色、粗細及字型的大小等屬性
'''
# 1.基本方法
'''
首先,用導入pyplot子庫語句:
import matplotlib.pyplot as plt
然後用
plt.figure(figsize=(w, h),dpi=x)
建立一個繪圖對象,并設定對象的寬度比例w和高度比例h。例如:
plt.figure(figsize=(4,3), dpi=200)
為建立一個4:3的每英寸200點分辨率的繪圖對象,調用plt.plot()方法在繪圖對象中進行繪圖。
pyplot()方法也可通過調用subplot()方法增加子圖。subplot()方法通常包含三個參數:共有幾行、幾列、本子圖是第幾個子圖。
例如,p1 = plt.subplot(211)或p1 = plt.subplot(2,1,1)表示建立一個2行1列的子圖,p1為第一個子圖。
plot()方法的參數通常包括x、y軸兩個變量及圖形的顔色、線型、資料點标記等。
常見的顔色字元有:'r'(紅色,red)、'g'(綠色,green)、'b'(藍色,blue)、'c'(青色,cyan)、'm'(品紅,magenta)、
                'y'(黃色,yellow)、'k'(黑色,black)、'w'(白色,white)等。
常見的線型字元有:'-'(直線)、'--'(虛線)、':'(點線)、'-.'(點畫線)等。
常用的描點标記有:'.'(點)、'o'(圓圈)、's'(方塊)、'^'(三角形)、'x'(叉)、'*'(五角星)、'+'(加号)等
例如:
plt.plot(x, y, '--*r')
表示以x和y兩個變量繪制紅色(r)虛線(--),以星号(*)作為描點标記。
在同一繪圖對象中可用plot()方法同時繪制多個圖形,例如:
plt.plot(x, w, 'b',x, y, '--*r', x, z, '-.+g')
表示在同一繪圖對象中同時呈現x-w、x-y和x-z三組變量的圖形,并且分别以藍色實線無描點、紅色虛線星描點、綠色點畫線加号描點表示
plot()方法可使用label參數标注圖例和公式
text():在指定坐标位置輸出文字
xlabel(),ylabel():顯示坐标軸标簽文字
title():顯示标題文字
matplotlib預設設定中沒有對中文的支援,如果需要使用中文文本标注,應在matplotlib的字型管理器font_manager中專門設定。
例如,将個性化字型對象myfont設為華文宋體:
myfont = matplotlib.font_manager.FontProperties (fname = 
              'C:/Windows/Fonts/STSONG.TTF')
并在輸出文字時,使用該字型屬性參數:fontproperties=myfont。
由于字型的變化,有時輸出負号會受影響(顯示不出負号,本例并不涉及),可預設matplotlib.rcParams['axes.unicode_minus'] = False解決
'''
# 例 9-14
# 在同一繪圖對象中,利用不同顔色和标注繪制折線圖形
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
myfont = matplotlib.font_manager.FontProperties \
                (fname='C:/Windows/Fonts/STSONG.TTF')
matplotlib.rcParams['axes.unicode_minus'] = False
x = [0, 1, 2, 4, 5, 6]
w = [3, 2, 5, 2, 3, 2]
y = [1, 2, 3, 2, 4, 1]
z = [1, 2, 3, 4, 5, 6]
plt.plot(x, w, 'b',x, y, '--*r', x, z, '-.+g')
plt.xlabel("x軸",fontproperties=myfont)
plt.ylabel("w、y、z軸",fontproperties=myfont)
plt.title("折線圖",fontsize=20,fontproperties=myfont)
plt.show()

# 2.繪制二維函數圖形
'''
二維函數圖形的繪制可調用numpy.linspace()方法,先生成資料系列,再用plot()方法繪圖。通式為:
numpy.linspace(start, stop, num=50, endpoint=True, retstep=False)
其中,參數依次為自變量起點、終點、生成資料點數、是否包括終點、是否傳回間隔。
'''
#  例9-15
'''在同一繪圖對象中,分别以紅色實線和藍色點狀線繪出x在-1.7~1.7之間變化時的函數圖形(100個采樣點),
并标注其圖例和對應公式:
y=3x3−3x2+4sin(x)
y=−3x3−3x2+4sin(x)
'''
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-1.7, 1.7, 100)
plt.plot(x, 3*x**3-3*x**2+4*np.sin(x), \
            "r",label="$y=3x^{3}-3x^{2}+4sin(x)$")
plt.plot(x, -3*x**3-3*x**2+4*np.sin(x), \
            "b.",label="$y=-3x^{3}-3x^{2}+4sin(x)$")
plt.legend()
plt.show()

# 例9-16
'''
 按以下公式繪制函數圖形:
x=−2sin2t+sint
y=−2cos2t+cost
其中,t的取值範圍為0~2p,步長為0.02
'''
import numpy as np
import matplotlib.pyplot as plt
t=np.arange(0,2*np.pi,0.02)
plt.plot(-2*np.sin(2*t)+np.sin(t),-2*np.cos(2*t)+np.cos(t))
plt.show()

# 例9-17 用極坐标方式呈現如下公式的紅色心狀圖形
import numpy as np
import matplotlib.pyplot as plt
t=np.arange(0,2*np.pi,0.02)
plt.subplot(111,polar=True)
w=np.sin(t)*(np.abs(np.cos(t)))**(1/2)/(np.sin(t)+7/5)-2*np.sin(t)+2
plt.plot(t,w,'r')
plt.show()

# 例9-18
'''
建立9:6的200dpi繪圖對象,并且在上、下兩個子圖中分别用藍色點狀線和紅色實線呈現x在0.5~2.5範圍内變化的函數圖形,
分别标注坐标軸标簽、圖例和相應的公式。
'''
import numpy as np
import matplotlib.pyplot as plt
from pylab import *
myfont = matplotlib.font_manager.FontProperties(fname=
                      'C:/Windows/Fonts/STSONG.TTF')
matplotlib.rcParams['axes.unicode_minus'] = False

def f1(x):
    return np.exp(-x)*np.cos(2*np.pi*x)

def f2(x):
    return np.sin(2*np.pi*x)*np.cos(3*np.pi*x)

x = np.arange(0.5,2.5,0.02)

plt.figure(figsize=(9,6),dpi=200)
p1 = plt.subplot(211)
p2 = plt.subplot(212)

p1.plot(x,f1(x),"b.",label="$y=e^{-x} \cdot \cos (2 \pi x)$")
p2.plot(x,f2(x),"r-",label="$y=\sin (2 \pi x) \cos (3 \pi x)$",
                         linewidth=2)

p1.axis([0.5,2.5,-1.0,1.5])

p1.set_ylabel("y",fontsize=12)
p1.set_title('函數曲線',fontsize=20,fontproperties=myfont)
p1.grid(True)
p1.legend()

p2.axis([0.5,2.5,-1.0,1.5])
p2.set_ylabel("y",fontsize=12)
p2.set_xlabel("x",fontsize=12)
p2.legend()

plt.show()