天天看点

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()