tags: python,数据分析,matplotlib,pyplot,pandas,numpy,Series,DataFrame
文章目录
一、Matplotlib
基础知识
1.1. Matplotlib
基本图表包括的元素
- x轴和y轴:水平和垂直的轴线
- 两轴刻度:刻度标示坐标轴的分隔,包括最小刻度和最大刻度
- 两轴刻度标签:表示特定坐标轴的值
- 绘图区域:实际绘图的区域
pandas
绘图,使用方便;matplotlib
专门绘图工具,样式更加丰富。
1.2. 只含单一曲线的图
n = np.array(np.random.randint(0,10, size=10))
plt.plot(np.arange(10), n)
plt.plot
中,x轴的数据不是必须的,不传x轴数据,会自动使用y轴数据的索引作为x轴数据。
plt.plot
只能画线型图,它没有类似pandas
中直接传入参数kind
值为bar
,hist
,scatter
等以改变图像类型的方法。
1.3. 包含多个曲线的图
1.3.1. 使用多个plot
函数
n = np.array(np.random.randint(0,10, size=10))
plt.plot(np.arange(10), n)
plt.plot(n,n)
上面的代码中调用了两次plot
函数,此时会在一个图中显示两条曲线。
如果在代码中使用了
plt.show()
函数,则其会使得该代码前面的图像先显示出来,如果后面还有代码要显示图像,则会在另一张图像中显示。
1.3.2. 在一个plot
函数中传入多对X,Y值
n = np.array(np.random.randint(0,10, size=10))
plt.plot(np.arange(10), n, n, n)
使用这种方法,plot
函数中的x和y不能省略,必须成对出现。使用上面的代码,能达到和1.3.1
中同样的效果。
1.4. 网格线
在绘制图像的代码plot
函数前后,加上代码plt.grid()
,则会在所画的图像中显示网格线。
在网格函数中还可以传如以下参数:
lw
ls
alpha
color
axis
1.4.1. lw
代表linewidth
,即线的粗细,例如lw=3
代表线宽为3
1.4.2. ls
代表linestyle
,即网格线的类型。
可以选择的参数有:'-', '--', '-.', ':'
,分别对应的类型为:实线,虚线,点划线,点虚线。
1.4.3. alpha
表示线的明暗程度,取值范围0~1
。
1.4.4. color
代表线颜色,可以使用以下参数
Html
十六进制字符串,如color = '#eeefff'
- 归一化到
[0, 1]
的RGB
元组,如color = (0.3, 0.3, 0.4)
- 合法的
HTML
颜色名,如color = 'red'
,或者选取下面列表中的数据:
颜色 | 别名 | HTML颜色名 | 颜色 | 别名 | HTML颜色名 |
---|---|---|---|---|---|
蓝色 | b | blue | 绿色 | g | green |
红色 | r | red | 黄色 | y | yellow |
青色 | c | cyan | 黑色 | k | black |
洋红色 | m | magenta | 白色 | w | white |
1.4.5. axis
代表需要显示哪个轴方向的线,可以为:'x'
、'y'
,如果不写默认为都有。
1.4.6. 代码效果
x = np.linspace(0,2*np.pi,1000)
y = np.sin(x)
plt.plot(x,y)
plt.grid(color = '#0000ff',lw=3,alpha=1,ls=':', axis='x')
1.5. 创建子图
使用axes = plt.subplot(n1, n2, n3)
的方式创建子图,参数n1, n2, n3
表示,子图有n1行,n2列,当前操作的是第n3个图(索引值,左上角为1,逐渐增加,一直到右下角)。需要注意的是所有的数字不能超过10 #E91E63。
该函数方法返回值为matplotlib.axes
类型,需要画子图时,先获取该返回值,然后对该值使用如之前介绍的plot
方法进行画图。
在子图创建代码
plt.subplot()
中传入title
参数时,可以设置各个子图的标题,也可是使用axes
的对象方法,如set_title()
。
示例代码:
# 注意图片大小是英寸
x = np.linspace(-20,20,1000)
plt.figure(figsize=(3*5,5))
axes1 = plt.subplot(1,3,1)
axes1.plot(x,np.sin(x))
axes1.grid(lw=2)
axes2 = plt.subplot(1,3,2)
axes2.plot(x,np.cos(x))
axes2.grid(c='r',alpha=0.6)
axes3 = plt.subplot(1,3,3)
axes3.plot(x,np.power(x,2))
axes3.grid(ls='--',c='g')
1.6. 坐标轴界限
1.6.1. plt.axis()
方法
如果axis
方法没有任何参数,则返回当前坐标轴的上下限axis(xmin =,ymax = )
。
可以使用plt.axis([-1,1, -1,1])
的方式进行设置两个轴的上下限,
也可以使用plt.axis(xmin=-1, xmax=3)
单独设置某个轴的上下限。
x = np.linspace(-1,1, 100)
y = (1 - x**2) ** 0.5
plt.plot(x, y, x, -y)
# 设置坐标轴界限
plt.axis([-2,1, -1,1])
# 显示当前坐标轴的界限
plt.axis()
1.6.2. plt.axis('xxx')
方法
直接指定图像的显示风格,上面的'xxx'
可以为:'tight'、'off'、'equal'、'scaled'
具体显示效果见下:
plt.figure(figsize=(3*6,2*5))
x = np.linspace(-1,1, 100)
y = (1 - x**2) ** 0.5
# 默认是tight, 紧凑的分割
axes1 = plt.subplot(2,3,1)
axes1.plot(x, y, x, -y)
axes2 = plt.subplot(2,3,2)
axes2.plot(x, y, x, -y)
# 取消坐标轴
axes2.axis('off')
axes3 = plt.subplot(2,3,3)
axes3.plot(x, y, x, -y)
axes3.axis('equal')
axes4 = plt.subplot(2,3,4)
axes4.plot(x, y, x, -y)
axes4.axis('scaled')
axes5 = plt.subplot(2,3,5)
axes5.plot(x, y, x, -y)
axes5.axis('scaled')
axes5.axis('off')
1.6.3. .xlim()
方法和.ylim()
方法
x = np.linspace(-1,1, 100)
y = (1 - x**2) ** 0.5
plt.plot(x, y, x, -y)
plt.xlim(xmin=-2, xmax=2)
plt.ylim(-2,2)
1.7. 坐标轴标签
.xlabel()
方法和.ylabel()
方法
x = np.linspace(-1,1, 100)
y = (1 - x**2) ** 0.5
plt.plot(x, y, x, -y)
plt.axis('equal')
# 设置x轴、y轴的标签
plt.xlabel('X', fontdict=dict(fontsize=20))
plt.ylabel('y=(1-x^2)^0.5', rotation=0, position=(0,1))
方法中第一个参数为标签,后面可以传入fontdict
来设置字体大小。另外可以设置旋转角度rotation
,以及位置参数position
。
其中如果设置标签的位置时,其中的参数为相对位置,坐标轴的原点为0,终点为1,如果设置x轴的位置,则位置参数中的第二个数字不起作用,同样设置y轴时,第一个标签不起作用。
另外如果要显示中文,需要在代码开始处,加上下面的代码:
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['font.sans-serif'] = ['SimHei']
1.8. 图像标题
x = np.linspace(-1,1,100)
y = (1-x**2)**0.5
plt.plot(x,y,x,-y)
plt.axis('equal')
plt.title('circle',fontdict=dict(fontsize=20,color='g'),position=(1,1))
1.9. 图例
1.9.1. 不对图例的位置风格等参数进行修改
在画多个系列的曲线图到一张图像上时,可以生成图例,来区分不同的系列。
可以给图例中的每个系列起名,即在使用plt.plot()
代码时,传入参数label
值,则该系列的图例名称即为label
对应的字符串值。(注意图例的名称不能以下划线开头。)
给定值之后,需要最后调用plt.legend()
函数来显示出图例。
示例代码如下:
# 推荐写法
x = np.linspace(0,10, 10)
# 图例名称不要以下划线开头
plt.plot(x, 0.5 * x, label='slow')
plt.plot(x, x, label='normal')
plt.plot(x, 2* x, label='fast')
# 自动的寻找一个 最好的位置best()来放置图裂
plt.legend()
1.9.2. 修改图例的参数
对于上面的代码,如果在plt.legend()
中不传入任何参数,则系统会选择最佳的位置来展示图例,并且自动选择图例中系列名称的堆叠方式。
可以在函数plt.legend()
中传入参数loc
来指定图例的位置。loc
的值为元组,使用相对位置,同样原点处为(0,0)
,右下角为(1,0)
,左上为(0,1)
,右上为(1,1)
,中心为(0.5,0.5)
。同样图例可以放在图像外面,比如放在图像上面,即loc=(0,1.04)
。
另外,可以修改图例中系列的堆叠方式,比如上面图片中的1列,可以修改为2列或者3列,操作为在函数plt.legend()
中传入参数ncol
,比如ncol=3
为显示为3列。
x = np.linspace(0,10, 10)
plt.plot(x, 0.5 * x, label='slow')
plt.plot(x, x, label='normal')
plt.plot(x, 2 * x, label='fast')
plt.legend(loc=(0,1.03), ncol=3, borderaxespad=0, mode='expand')
1.10. 保存图片
figure.savefig(filename,[dpi=],[facecolor=])
的选项
filename
含有文件路径的字符串或Python的文件型对象。图像格式由文件扩展名推断得出,例如,.pdf推断出PDF,.png推断出PNG (“png”、“pdf”、“svg”、“ps”、“eps”……)dpi
图像分辨率(每英寸点数),默认为100facecolor
图像的背景色,默认为“w”(白色)
figure = plt.figure()
x = np.linspace(0,10, 10)
plt.plot(x, 0.5 * x, label='slow')
plt.plot(x, x, label='normal')
plt.plot(x, 2 * x, label='fast')
plt.legend(loc=(0,1.03), ncol=3, borderaxespad=0, mode='expand')
figure.savefig('./legend.jpg',dpi=500,facecolor='g')
执行上面的代码之后,就会把1.9.2中的图片保存在代码运行的目录下,并且dpi为500,并且背景为绿色。
二、设置plot
图片的风格和样式
plot
语句中支持除X,Y以外的参数,以字符串形式存在,来控制颜色、线型、点型等要素,语法形式为:
plt.plot(X, Y, 'format', ...)
2.1. 点和线的样式
2.1.1. 颜色
- 使用别名
color='r'
下表为颜色别名对应的颜色名称
颜色 | 别名 | HTML 颜色名 | 颜色 | 别名 | HTML 颜色名 |
---|---|---|---|---|---|
蓝色 | b | blue | 绿色 | g | green |
红色 | r | red | 黄色 | y | yellow |
青色 | c | cyan | 黑色 | k | black |
洋红色 | m | magenta | 白色 | w | white |
-
合法的
HTML
颜色名color = 'red'
-
HTML
十六进制字符串color = '#eeefff'
-
归一化到
[0, 1]
的RGB
元组color = (0.3, 0.3, 0.4)
2.1.2. 透明度
修改画图参数中的alpha
参数,范围为[0,1]
。
x = np.linspace(-1, 1, 100)
y = (1 - x **2) **0.5
# 透明度是从0到1之间
plt.plot(x, y, x, -y, c='r', alpha=0.5)
plt.axis('equal')
2.1.3. 设置背景色
通过plt.subplot()
方法传入facecolor
参数,来设置坐标轴的背景色。
而在plt.figure()
方法传入facecolor
参数,来设置图片的背景色。
figure = plt.figure(facecolor='g')
x = np.linspace(-1, 1, 100)
y = (1 - x **2) **0.5
plt.subplot(facecolor='r')
plt.plot(x, y, x, -y, c='k', alpha=0.5)
plt.axis('equal')
2.1.4. 设置线型
使用参数linestyle
或ls
,具体取值见下:
线条风格 | 描述 | 线条风格 | 描述 |
---|---|---|---|
'-' | 实线 | ':' | 虚线 |
'--' | 破折线 | 'steps' | 阶梯线 |
'-.' | 点划线 | 'None' | 什么都不画 |
2.1.4. 设置线宽
使用linewidth
或lw
参数,
x = np.linspace(-1, 1, 100)
y = (1 - x **2) **0.5
plt.plot(x, y, x, -y, c='k',lw=4.9)
plt.axis('equal')
2.1.5. 设置点参数
使用marker
参数进行控制点的类型,具体取值见下:
标记 | 描述 | 标记 | 描述 |
---|---|---|---|
'1' | 一角朝下的三脚架 | '3' | 一角朝左的三脚架 |
'2' | 一角朝上的三脚架 | '4' | 一角朝右的三脚架 |
's' | 正方形 | 'p' | 五边形 |
'h' | 六边形1 | 'H' | 六边形2 |
'8' | 八边形 | ||
'.' | 点 | 'x' | X |
'*' | 星号 | '+' | 加号 |
',' | 像素 | ||
'o' | 圆圈 | 'D' | 菱形 |
'd' | 小菱形 | '' ,'None' ,' ' ,None | 无 |
'_' | 水平线 | '|' | 垂直线 |
'v' | 一角朝下的三角形 | '<' | 一角朝左的三角形 |
'^' | 一角朝上的三角形 | '>' | 一角朝右的三角形 |
点的一些其他颜色的设置
参数 | 描述 | 参数 | 描述 |
---|---|---|---|
markeredgecolor | 点边缘的颜色 | markeredgewidth | 点边缘的宽度 |
markerfacecolor | 点内部的颜色 | markersize | 点的大小 |
2.1.6. 多参数连用
在plt.plot()
函数中,可以将颜色、点型、线型使用字符串的方式一起传入进来,三者的顺序可以变化。
x = np.linspace(0, 10, 10)
plt.plot(x, '--ro', lw=2, markersize=18, markeredgecolor='g', markeredgewidth=6, markerfacecolor='c')
多个曲线不同设置:
# 为对个曲线设置不同的属性,使用位置参数
x = np.linspace(0, 2*np.pi ,10)
y = np.sin(x)
plt.plot(x,y, 'r--d',
x, x, 'g-o')
2.2. X、Y轴坐标刻度
使用plt.xticks()
和plt.yticks()
方法,向其中传入列表参数,列表中每个字符串就是要显示在对应轴上的结果。同样也可以设置标度的大小,使用fontsize
参数。
示例如下:
x = np.linspace(0, 2*np.pi ,100)
y1 = np.sin(x)
y2 = np.cos(x)
plt.plot(x,y1,'r--',x,y2,'g:',lw=3)
# 传刻度和刻度的标签
plt.xticks([0, np.pi/2, np.pi, 3*np.pi/2, 2*np.pi], ['0', '$\pi/2$', '$\\theta$', '$3\pi/2$', '2$\pi$'], fontsize=20)
plt.yticks(fontsize=20)
在标度字符中,可以传入希腊字母的单词,用
$\$
包裹,则可以显示对应的字母,如果有的字母对应的单词第一个字母和\
连用为特殊显示,则需要再使用一个\
将其转义,如'$\\beta$'
。
三、2D图形
3.1. 直方图
使用代码plt.hist()
画直方图。使用方法和pandas
中的直方图类似。
直方图的参数只有一个x!!!不像条形图需要传入x,y。
plt.hist()
的参数:
bins
可以是一个bin
数量的整数值,也可以是表示bin
的一个序列。默认值为10density
如果值为True
,直方图的值将进行归一化处理,形成概率密度,默认值为False
color
指定直方图的颜色。可以是单一颜色值或颜色的序列。如果指定了多个数据集合,颜色序列将会设置为相同的顺序。如果未指定,将会使用一个默认的线条颜色orientation
通过设置orientation
为horizontal
创建水平直方图。默认值为vertical
n = np.random.randint(0, 10,size=10)
# 直方图颜色不能 简写
_ = plt.hist(n, bins=50, density=True, color='r', orientation='horizontal')
3.2. 条形图
条形图必须传入x值和y值。
条形图有两种,一种是垂直条形图,使用plt.bar()
创建;另一种是水平条形图,使用plt.barh()
创建。
示例代码:
n = np.random.randint(0, 10,size=10)
plt.figure(figsize=(2*8,5))
axes1 = plt.subplot(121,title='plt.bar()')
# 必须传x,y,不能 省
axes1.bar(np.arange(0,10), n, width=0.5, color='r' )
axes2 = plt.subplot(122,title='plt.barh()')
axes2.barh(np.arange(0,10), n, height=0.8, color='c' )
3.3. 饼图
3.3.1. 未占满饼图和占满饼图
饼图只有一个参数x。
饼图类似与直方图,其展示的是个部分占总体的比例,条形图适合比较各部分的大小。
如果饼图中传如的x值为小数,且总和不超过1
时,饼图会默认传入的参数为已经算好的比例值,其会生成未占满的饼图,示例如下
# 传递比例就会严格按照传递的比例来显示饼状图
n = [0.1, 0.3, 0.5]
plt.pie(n)
而如果x数据总和超过1时,其则会自动计算各部分的比例,然后安装比例进行画图,示例如下:
n = [0.2, 0.3, 0.5, 1]
plt.pie(n)
3.3.2. 饼图的显示属性设置
labels
参数设置每一块的标签,需要传入列表参数对每一块进行指定。
labeldistance
参数设置标签距离圆心的距离(其值为比例值,即小数)
autopct
参数设置比例值的显示格式'%.2f%%'
(其中的.2f%
意思为显示小数后两位,并以%的形式显示)。
pctdistance
参数设置比例值文字距离圆心的距离
explode
参数设置每一块顶点距圆形的长度(比例值),其值为列表。
colors
参数设置每一块的颜色
shadow
参数为布尔值,设置是否绘制阴影
startangle
设置旋转角度
示例如下:
plt.figure(figsize=(8,8))
n = [0.1, 0.2, 0.4, 0.3]
_ = plt.pie(n, autopct='%.2f%%', explode=[0.1, 0.2, 0.3, 0.4], shadow=True, labels=list('ABCD'), labeldistance=0.6, pctdistance=1.1,
colors=['r','g', 'b', 'm'], startangle=60, textprops=dict(size=20))
3.4. 散点图
散点图需要两个参数x,y。使用plt.scatter()
示例:
x = np.random.randn(1000)
y = np.random.randn(1000)
plt.figure(figsize=((10,8)))
plt.scatter(x,y, marker='d', s=np.random.randint(0,150, 1000), color=np.random.rand(1000,4))
plt.axis("off")
3.5. 玫瑰图
其可以看作为直方图在极坐标下的一种情况。
例:当前有某城市的风向情况,具体数据在r_data
中,该数据中为各个风的风向角度,需要用玫瑰图将该城市的风向分布绘制出来。
r_data = np.array([ 10. , 20. , 40. , 90. , 87. , 79. ,
70. , 80. , 90. , 90. , 105. , 100. ,
110. , 116.504 , 145.001 , 145.001 , 145.001 , 155.503 ,
155.503 , 155.503 , 190. , 126.501 , 250. , 99.0009,
330.003 , 20. , 70. , 70. , 10. , 80. ,
126. , 100. , 135. , 130. , 160. , 130.501 ,
190. , 180. , 193.502 , 193.502 , 224.004 , 224.004 ,
224.004 , 180. , 190. , 254.001 , 257.503 , 190. ,
159.5 , 100. , 80. , 90. , 80. , 80. ,
90. , 90. , 90. , 97. , 89. , 88.0147,
107.004 , 107.004 , 132.503 , 132.503 , 132.503 , 251. ])
data, data_range = np.histogram(r_data, range=[0,360], bins=8)
思路:使用直方图中的函数np.histogram(r_data, range=[0,360], bins=8)
,首先将风向范围设定为[0.360]
,分成8个部分显示,该函数会返回一个元组,其中 第一个数据为在分好的范围内出现的次数,第二个为分好的范围。
但是玫瑰图中的极坐标使用的是弧度值,而上面划分好的范围值data_range
为角度制数据,而且数据data
长度为8,而data_range
长度为9,因为最后360和0重合了。所以需要将生成弧度制范围,使用代码r_range = np.arange(0,2*np.pi,np.pi/4)
。
详细代码:
r_data = np.array([ 10. , 20. , 40. , 90. , 87. , 79. ,
70. , 80. , 90. , 90. , 105. , 100. ,
110. , 116.504 , 145.001 , 145.001 , 145.001 , 155.503 ,
155.503 , 155.503 , 190. , 126.501 , 250. , 99.0009,
330.003 , 20. , 70. , 70. , 10. , 80. ,
126. , 100. , 135. , 130. , 160. , 130.501 ,
190. , 180. , 193.502 , 193.502 , 224.004 , 224.004 ,
224.004 , 180. , 190. , 254.001 , 257.503 , 190. ,
159.5 , 100. , 80. , 90. , 80. , 80. ,
90. , 90. , 90. , 97. , 89. , 88.0147,
107.004 , 107.004 , 132.503 , 132.503 , 132.503 , 251. ])
data, data_range= np.histogram(r_data, range=[0,360], bins=8)
r_range = np.arange(0,2*np.pi,np.pi/4)
plt.figure(figsize=(8,8))
plt.subplot(projection='polar')
plt.bar(r_range, data, color=np.random.rand(8,3), width=np.pi/4)
四、图形内的文字、注释、箭头
4.1. 文字
Pyplot 函数 | API 方法 | 描述 |
---|---|---|
text() | mpl.axes.Axes.text() | 在Axes 对象的任意位置添加文字 |
xlabel() | mpl.axes.Axes.set_xlabel() | 为X轴添加标签 |
ylabel() | mpl.axes.Axes.set_ylabel() | 为Y轴添加标签 |
title() | mpl.axes.Axes.set_title() | 为Axes 对象添加标题 |
legend() | mpl.axes.Axes.legend() | 为Axes 对象添加图例 |
figtext() | mpl.figure.Figure.text() | 在Figure 对象的任意位置添加文字 |
suptitle() | mpl.figure.Figure.suptitle() | 为Figure 对象添加中心化的标题 |
annnotate() | mpl.axes.Axes.annotate() | 为Axes 对象添加注释(箭头可选) |
所有的方法会返回一个matplotlib.text.Text
对象
示例代码:
x = np.linspace(0, 7, 100)
y = np.sin(x)
# plt.subplot(facecolor='g')
plt.figure(facecolor='g')
plt.plot(x,y)
# text在坐标系内添加文本说明
plt.text(0+0.1,0, 'sin(0)=0')
# figtext使用相对坐标
plt.figtext(0.5, 0.5, 'sin($\pi$)=0')
注意:
plt.text()
使用绝对坐标设置其要显示的文本位置,而plt.figtext()
使用相对坐标来设置其位置。
4.2. 注释和设置其中的箭头
使用代码
plt.annotate(s, (x,y), (xtext,ytext),
arrowprops=dict(width,headwidth,headlength,facecolor,shrink),)
进行设置。
xy
参数设置箭头指示的位置,xytext
参数设置注释文字的位置
arrowprops
参数以字典的形式设置箭头的样式,其中的参数如下:
width
参数设置箭头长方形部分的宽度,
headlength
参数设置箭头尖端的长度,
headwidth
参数设置箭头尖端底部的宽度,
facecolor
设置箭头颜色
shrink
参数设置箭头顶点、尾部与指示点、注释文字的距离(比例值)
另外可以直接在
arrowprops
参数字典中设置arrowstyle
值,来选择箭头的样式,
可选择的值有'-', '->', '-[', '<-', '<->', 'fancy', 'simple', 'wedge'
。
示例如下:
n = [14, 11, 14,13,14,10, 30, 12, 11, 14, 13, 13, 12, 13]
plt.plot(n)
plt.ylim(ymax=35)
plt.annotate('This spot must really\n mean something',(6,30), (8,32), arrowprops=dict(width=20, headwidth=25, headlength=20, facecolor='k', shrink=0.1))
五、3D曲面图
首先需要导入画3d图所需要的模块
from mpl_toolkits.mplot3d.axes3d import Axes3D
画图的时候,需要先使用X,Y = np.meshgrid(x,y)
将xy两轴数据网格化,并获取网格化后的值。
然后将网格化后的值传入曲面图的方程中,以计算z轴的值。
使用.plot_surface()
的方式画出曲面图。
示例代码如下:
x, y = np.linspace(0, 7, 100), np.linspace(0,7, 100)
X, Y= np.meshgrid(x,y)
# 三维图形的方程
Z = np.sin(X) + np.cos(Y) + 2
plt.figure(figsize=(2*8,6))
axes1 = plt.subplot(1,2,1, projection='3d')
axes1.plot_surface(X, Y, Z)
axes2 = plt.subplot(1,2,2, projection='3d')
axes2 = axes2.plot_surface(X, Y, Z, cmap='rainbow')
# shrink长宽一起缩放
plt.colorbar(axes2, shrink=0.5)
在.plot_surface()
方法中传入图像的样式,可以对图片显示进行改变。使用plt.colorbar()
可以在图像旁显示以颜色作为区分大小值的标尺。