写在前面:
这是本人学习python绘图所做笔记,具体内容参考CSDN博客、菜鸟教程、知乎等,特别感谢某位低调学长在我Vscode莫名装不好库时所提供的巨大帮助。
零、关于字体
- 欲设置汉字,需要引入:
from pylab import mpl
mpl.rcParams['font.sans-serif']=['SimHei']
mpl.rcParams['axes.unicode_minus']=False
其中’SimHei’代表黑体
'SimSun’代表宋体
一、折线图的绘制
- 首先以列表或元组的形式设置横纵坐标,如:
x=["8.17","8.24","8.31","9.7","9.14","9.21","9.28"]
Americas=[150.7234,162.3891,148.1995,176.3048,146.2450,138.6267,127.3971]
Europe=[113.4516,116.5092,117.2461,114.6065,111.3722,109.0667,109.7735]
SouthEast_Asia=[73.1279,61.4080,59.6456,54.3013,45.3539,38.3053,34.4305]
Western_Pacific=[42.9153,51.3581,55.3344,53.1922,48.7586,46.1979,37.8919]
- 使用plot函数进行绘制,格式:
plt.plot(x,y,label="xxx",color='r',marker='+')
其中第一个参数x为横坐标值,第二个参数y为纵坐标对应值,第三个参数label="xxx"表示标签名称(可省略),第四个参数color表示线的颜色(省略即为默认),第五个参数marker表示每个点的形状(省略即为默认),具体例子如下:
plt.plot(x,Americas,label="美洲",color="r",marker="+")
plt.plot(x,Europe,label="欧洲",color='y',marker=".")
plt.plot(x,SouthEast_Asia,label="东南亚",color='g',marker="^")
plt.plot(x,Western_Pacific,label="大洋洲",color='b',marker="p")#分别绘制四个地区
- 图表美化相关:
设置图标题,如:
plt.title("新冠肺炎确诊情况")
设置x轴标签,如:
plt.xlabel("日期")
设置y轴标签,如:
plt.ylabel("新增确诊人数/万人")
设置纵轴上下限,如:
plt.ylim(0,200)
添加图例,如:
plt.legend(labels=[],loc=(x,y)/"")
labels:图例对应名称(可省略)
loc:位置,(x,y)表示横纵位置,也可以用"best",“center”,"lower right"等等
- 显示:
plt.show()
综合以上几种操作代码为:
import matplotlib.pyplot as plt
from pylab import mpl
mpl.rcParams['font.sans-serif']=['SimHei']
mpl.rcParams['axes.unicode_minus']=False
plt.figure(figsize=(4,6))
x=["8.17","8.24","8.31","9.7","9.14","9.21","9.28"]
Americas=[150.7234,162.3891,148.1995,176.3048,146.2450,138.6267,127.3971]
Europe=[113.4516,116.5092,117.2461,114.6065,111.3722,109.0667,109.7735]
SouthEast_Asia=[73.1279,61.4080,59.6456,54.3013,45.3539,38.3053,34.4305]
Western_Pacific=[42.9153,51.3581,55.3344,53.1922,48.7586,46.1979,37.8919]
plt.plot(x,Americas,label="美洲",color="#000000",marker="+")
plt.plot(x,Europe,label="欧洲",color='y',marker="o")
plt.plot(x,SouthEast_Asia,label="东南亚",color='g',marker="^")
plt.plot(x,Western_Pacific,label="大洋洲",color='b',marker="p")
plt.title("新冠肺炎确诊情况")
plt.xlabel("日期")
plt.ylabel("新增确诊人数/万人")
plt.ylim(0, 200)
plt.legend()
plt.show()
最终结果如图:
二、连续函数图像的绘制
- 需要导入科学计算基础库以及绘图库:
import numpy as np
import matplotlib.pyplot as plt
关于numpy的一点额外说明:
利用自带函数可直接对数列中每个数据进行运算,如:
>>>import numpy as np
>>>a=[1,2,3,4,5]
>>>b=np.sin(a)
array([ 0.84147098 0.90929743 0.14112001 -0.7568025 -0.95892427])
可用函数有:sin, cos, tan, arcsin, arccos, arctan, around(四舍五入), floor, ceil等
- 生成一组x坐标值——arange函数:
格式类似于range:开始值,终值(不含),步长(省略时为1,也可以为负数),如:
>>>import numpy as np
>>>np.arange(0,1,0.1)
array([0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.8,0.9])
arange的参数可以为浮点数,而range只能为整数,而且arange返回的是列表,range不是
- 生成一组x坐标值——linspace函数:
格式为:开始值,终值,元素个数(省略时为50)
在闭区间[开始值,终止值]之间等距生成指定个数元素(浮点数)的一个数组,如:
>>>import numpy as np
>>>np.linspace(0,1.2,13)
array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. , 1.1])
>>>np.linspace(3,4,5)
array([3. , 3.25, 3.5, 3.75, 4. ])
(小数点应该是表示这是一个float类型而非int)
可有第四个参数endpoint,为True时含终值,为False时不含,省略时默认True,如
>>>np.linspace(3,4,5,endpoint=False)
array([3. , 3.2, 3.4, 3.6, 3.8])
- 创建子图——subplot函数:
subplot(numRows,numCols,plotNum)
numRows:子图的总计行数,默认为1
numCols:子图的总计列数,默认为1
plotNum:指明图样放在哪个子区域中,从左到右从上到下依次编号
subplot每次只创建一张子图,通过plotNum参数指明子图的编号(即位置),如:
plt.subplot(2,1,1)
plt.(x1,y1,'rx-') #第三个参数用单引号引住,以此为颜色、数据点形状、线形
plt.subplot(2,1,2)
plt.plot(x2,y2,'ko-')
- 设置画布——figure函数:
plt.figure(figsize=(x,y),dpi=80)
x,y:图形的长宽大小
dpi:分辨率,默认为80,越大越清晰,但不建议太大
若想同时绘制多个图,只需要给figure函数中增加一个整数参数,如:
plt.plot(x1,y1)
plt.figure(1,figsize=(6,6),dpi=80)
plt.plot(x2,y2)
plt.figure(2,figsize=(8,8),dpi=100)
综合以上几种操作总代码为:
import numpy as np
import matplotlib.pyplot as plt
x1=np.linspace(0.0,5.0)
x2=np.linspace(0.0,5.0)
y1=np.cos(2*np.pi*x1)
y2=np.cos(2*np.pi*x2)*np.exp(-x2)
plt.figure(figsize=(8,8)) #创建一个绘图对象,设置其大小
plt.subplot(2,1,1)
plt.plot(x1,y1,'rx-') #红色,离散数据点形状为“,曲线为实线
plt.xlabel('time(s)')
plt.ylabel('Undamped')
plt.title('A tale of 2 subplots')
plt.subplot(2,1,2)
plt.plot(x2,y2,'ko-') #黑色,实心圆点,曲线为实线
plt.xlabel('time (s)')
plt.ylabel('Damped oscillation')
plt.show()
最终结果如图:
三、柱状图的绘制
- bar函数,格式:
bar(left,height,width=0.8,bottom=None)
left:柱状图的做边缘的x坐标序列(列表或元组),这里有个小技巧,如果要是画多个图,第一个横坐标序列若为x,则可令第二个横坐标序列为x+width,这样两个柱状图能正好连起来而不重合
height:柱状图的高度序列(列表或元组)
以下参数均不是必要参数,此为我认为较为常用,[全部内容在这里](matplotlib.pyplot.bar — Matplotlib 3.5.2 documentation):
width:柱状图的宽度,默认值为0.8
bottom:bar的地步高度,默认值为None
align:对齐方式,‘center’或者’edge’,默认值为’center’
color/edgecolor:柱状图/边线颜色,默认值为None(蓝色)
linewidth:线的粗细,默认值为None
orientation:柱状图朝向,vertical或horizontal,默认值为vertical
log:是否使用对数坐标,true为对数轴,False为正常轴
- legend函数详细用法:
legend(*args,**kwargs)
args:参数序列,即图形对象,可以是bar函数的返回值
kwargs:参数所对应的图里序列,类型为元组,每个部分用单引号引起来,这两个参数的元素数需相同
相较于绘制折线图中直接在plot中label='xxx’是另一种方法
如:
rects1=bar(,...,)
rects2=bar(,...,)
legend((rects1,rects2),('Men','Women'))
- text函数详细用法:
首先需要调用pylab的mpl模块,格式如下:
import matplotlib as plt
from pylab import mpl
plt.text(x,y,s,**kwargs)
x,y:分别为文本的横纵坐标值,针对不同的图建议通过尝试找到合适的x,y
s:为所要添加文本,用单/双引号引起来
**kwargs为可选参数,常见有:
ha:水平对齐(horizontal align)方式,‘center’,‘left’或’right’(x坐标相对文字的位置)
va:垂直对齐(vertical align)方式,‘center’,‘top’或’bottom’(y坐标相对文字的位置)
fontsize:字体大小,默认值为12
综合以上几种操作代码为:
import numpy as np
import matplotlib.pyplot as plt
N=5
menMeans=(20,35,30,35,27)
womenMeans=(25,32,34,20,25)
ind=np.arange(N)
width=0.35
ind=np.array(range(N))
rects1=plt.bar(ind,menMeans,width,color='r',edgecolor='b')
rects2=plt.bar(ind+width,womenMeans,width,color='y',edgecolor='m')
plt.legend((rects1, rects2),('Men','Women'))
plt.xlabel('men and women')
plt.ylabel('Scores')
plt.title('Scores by group and gender')
plt.xticks(ind+width/2, ('G1','G2','G3','G4','G5'))
plt.show()
最终结果如图:
四、极坐标图形的绘制
- 与连续函数图形绘制类似,只需增加参数polar=True,如:
t=np.arange(0,2*np.pi,0.01)
plt.subplot(2,2,1,polar=True) #这里是为了画多个图
r1=a*(1+np.sin(t))
plt.plot(t,r1,color='r')
- subplot_adjust函数设置多个子图间距,如:
plt.subplots_adjust(wspace=0.3,hspace=0.6)
wspace,hspace:为横纵间距,建议根据实际情况调整
亦可在plt.show()之前使用plt.tight_layout()使子图不重叠紧凑排布
综合以上操作,代码为:
import numpy as np
import matplotlib.pyplot as plt
a=10
t=np.arange(0,2*np.pi,0.01)
plt.subplot(2,2,1,polar=True)
r1=a*(1+np.sin(t))
plt.plot(t,r1,color='r')
plt.title('r=a(1+sint)')
plt.subplot(2,2,2,polar=True)
r2=a*np.cos(t)*np.cos(t)
plt.plot(t,r2,color='g')
plt.title('r=acos^2t')
plt.subplot(2,2,3,polar=True)
r3=a*np.sin(t)*np.sin(t)
plt.plot(t,r3,color='m')
plt.title('r=asin^2t')
plt.subplot(2,2,4,polar=True)
r4=a*np.cos(t)*np.sin(t)
plt.plot(t,r4,color='b')
plt.title('r=asint*cost')
plt.subplots_adjust(wspace=0.3,hspace=0.6)
plt.show()
最终结果如图:
五、隐函数图形的绘制
- 导入sympy库相应函数:
from sympy import plot_implicit as pt,Eq
from sympy.abs import x,y #引入隐函数对应变量
- 绘制隐函数:
pt(Eq(x*x+x*y+y*y,1),line_color='b')
最终结果如图:
六、三维图形的绘制
- 导入sympy库相应函数:
from sympy import *
from sympy.plotting import plot3d
- 绘制形如 z = ( x + y ) e − x 2 − y 2 x ∈ [ − 3 , 3 ] , y ∈ [ − 2 , 2 ] z=(x+y)e^{-x^2-y^2}\ x\in[-3,3],y\in[-2,2] z=(x+y)e−x2−y2 x∈[−3,3],y∈[−2,2]的函数图像:
from sympy.abc import x,y
a=plot3d((x+y)*exp(-x**2-y**2),(x,-3,3),(y,-2,2))
最终结果如图:
七、饼形图的绘制
- 导入matplotlib.pyplot即可:
import matplotlib.pyplot as plt
- pie函数,格式:
plt.pie([],colors=[],labels=[],explode=[],autopct='')
第一个参数为各个部分个数(会自动计算百分比)
colors:为颜色对应的列表,需一一对应
labels:为每一部分的名称
explode:为每部分远离圆心距离,可表突出强调,类型为float(一般0.1左右即可)
autopct:格式化数据
综合以上几种操作代码为:
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams["font.sans-serif"]=["SimSun"]
matplotlib.rcParams["axes.unicode_minus"] = False
y=[21,47,48,36,47]
plt.pie(y,colors=['gray','green','limegreen','blue','purple'],explode=[0,0,0,0,0.1],autopct='%.2f%%')
plt.title("各个等级人数占比")
plt.legend(labels=('newbie','pupil','specialist','expert','candidate'),title='不同等级对应颜色',loc=(1,0.618))
plt.show()
最终结果如图:
附:
关于颜色的说明
简写 | 颜色 |
---|---|
‘r’ | 红色 |
‘g’ | 绿色 |
‘b’ | 蓝色 |
‘c’ | 青色 |
‘m’ | 品红色 |
‘y’ | 黄色 |
‘k’ | 黑色 |
‘w’ | 白色 |
自定义颜色,形如"#00FF00"表示绿色,具体可参考HTML颜色值
关于离散数据点形状的说明
形状 | 简写 |
---|---|
黑点 | ‘.’ |
加号 | ‘+’ |
型号 | ‘**’ |
实心圆点 | ‘o’ |
菱形 | ‘d’ |
五角星 | ‘p’ |
六角形 | ‘h’ |
X号 | ‘x’ |
方块 | ‘s’ |
小三角 | ‘^’ |
关于线形的说明
类型 | 简写 | 说明 |
---|---|---|
‘solid’(默认) | ‘-’ | 实线 |
‘dotted’ | ‘:’ | 点虚线 |
‘dashed’ | ‘–’ | 破折线 |
‘dashdot’ | ‘-.’ | 点划线 |
‘None’ | ’ ’ | 不画线 |