Python Matplotlib画图

主要用于作图、可视化问题

安装

pip install matplotlib

导入模块

# 下面两种二选一,第二种比较常用
from matplotlib import pylab
# 导入pyplot+numpy
import matplotlib.pyplot as plt
# 仅导入pyplot

导入模块pyplotpylab,可以参考下面链接观察两者区别:
https://www.cnblogs.com/Shoesy/p/6673947.html
(说白了就是pylay=pyplot+numpy)

图片中文乱码问题

输入这三行解决

from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['FangSong'] # 指定默认字体
mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题

常用图形

折线/散点图

主要使用plot()来展示,里面前两个参数代表xy坐标(注意x,y数量要一样),第三个参数可以用来设置散点图('o')或者颜色、线条形式等各种样式,并且第三个参数可以同时传入多个,比如要红色的散点图就:'0r'
(1)颜色样式:

青       c(cyan)
红       r
品红     m(magente)
绿       g
蓝       b
黄       y
黑       k
白       w

(2)线条样式:

-      直线
--     虚线
-.     就是这个样
:      细小虚线(就是`...`)

(3)点的样式:

s      方形
h      六角形(比大写的细一点)
H      六角形
*      星形
+      加号
x      x形
d      菱形
D      菱形(和上面的些微不一样)
p      五边形

(4)坐标区间:

plt.axis([-10, 10, 0, 2])
#x轴从-10到10,y轴0到2

或者分别设置x、y的区间:

plt.xlim(-10,10)
#设置x范围在-10到10
plt.ylim(0,2)
#设置y范围在0到2

注:
设置点的样式时默认就是散点图,以及同类样式只能设置一个(比如不能设置两种颜色),并且还可以把多个图集合在一起展示,那就多plot几个,plot就相当于一个画布,每plot一个就相当于在上面画一张图,再弄就继续在上面画

实际举例
x = [1,3,5,2,4]
y = [2,4,5,1,3]
plt.plot(x, y)  #将x,y轴坐标数据传入,第三个参数是展现形式,默认是折线图
plt.plot(x, y, 'ok')    #黑色散点图
plt.xlim(0,10)  #设置x范围在0到10
plt.ylim(0,10)  #设置y范围在0到10
plt.title("show")   #设置标题名,在中上方
plt.xlabel("num")   #设置x轴名称,在中下方
plt.ylabel("age")   #设置y轴名称,在中左方
plt.show()      #可视化显示数据,注意show了之后画布就被清空了,前面的内容下次就show不出来了
直方图

主要用hist()来显示,实现方式很简单,把一组数据放入括号里就行了,例如随机生成一堆正态分布的数,然后直方图显示:

data = numpy.random.normal(0, 1, 10000000)  #随机生成这么多个符合正态分布的数
style = numpy.arange(-3, 3, 0.01)
#从-3到3按0.01为间隔的格式,如果不设格式,弄出来一点都不像
plt.hist(data, style)
plt.show()

其中如果要设置直方图格式(宽度、上下限、是否要轮廓)可以这样:

x = numpy.random.random_integers(0, 100, 100)   #随机生成100个上下限为0到100的数
style = numpy.arange(1, 100, 2)  #在1到100内,阶值为2
plt.hist(x, style, histtype='stepfilled')
#生成相应样式直方图,前面的样式可以看作范围是1到100里
#直方图的每条柱子宽度为2的意思
#第三个参数是不要轮廓的意思,默认是有
plt.show()
#实际上你会发现只有1到99的数据,因为99+2>100,而100要和101的数据在一起才能显示
#所以除非有101,才能显示100-101的数据

注:
直方图和折线图这些不太一样,折线图是传入两个等长数据,然后每个x、y坐标一一对应展示出来。而直方图是:第一个参数代表你传入的所有数据,第二个参数代表你传入的x轴范围,然后直方图会将第一个参数里传入的数据一个个计算在某个范围内含有的数据量,因此传入的两个参数数据不一定要等长,例如下面的例子:

x = [1,2,2.5,3,4,5]
# 传入一堆数据(6个)
y = [1,2,3,4,5]
# 传入范围为1-5,其中:
# 1-2有1个(1)
# 2-3有2个(2、2.5)
# 3-4有1个
# 4-5有2个
plt.hist(x, y)
plt.show()  

结果如图:


直方图结果

可以看出数据被自动分配到对应的范围内上了

子图

使用subplot(row, col, area):三个参数分别是行数、列数和区域,比如要将原图分成2行2列(切成4份),然后要左下角那个图就:

plt.figure(figsize=(10, 50))
# figure设置子图排列尺寸,间距10,尺寸为50*50
plt.subplot(2, 2, 3)
plt.show()

如果想4个图都显示就4个subplot,分别1、2、3、4就行了,然后在各图的subplot之后写的都是每个图的内容,现在我们试试弄一个2行,第一行两列的图片(想象下鼠标的样子),而且分别是不同的内容:

plt.subplot(2,2,1)      #2行两列的第一个图,内容为1到100递增为5的直方图
x = numpy.arange(1,100,5)
plt.hist(x)
plt.subplot(2,2,2)      #两行两列的第二个图,内容为100个符合正态分布数的直方图
y = numpy.random.normal(0,1,100)
plt.hist(y)
plt.subplot(2,1,2)      #两行一列的第二个图,此时会把上面两个图合起来看出两行一列的第一个图,而当前图看成第二个图,内容为一个折线图
z = [[1,2,3,4,5],[1,5,3,2,4]]
plt.plot(z[0],z[1],'k')
plt.show()              #展示这三个图
饼状图
示例
from matplotlib import pyplot as plt 
#调节图形大小,宽,高
plt.figure(figsize=(6,9))
#定义饼状图的标签,标签是列表
labels = [u'第一部分',u'第二部分',u'第三部分']
#每个标签占多大,会自动去算百分比
sizes = [60,30,10]
colors = ['red','yellowgreen','lightskyblue']
#将某部分出来,使用括号,将第一块分割出来,数值的大小是分割出来的与其他两块的间隙
explode = (0.05,0,0)

patches,l_text,p_text = plt.pie(sizes,explode=explode,labels=labels,colors=colors, \
labeldistance = 1.1,autopct = '%3.1f%%',shadow = False, startangle = 90,pctdistance = 0.6)
#labeldistance,文本的位置离远点有多远,1.1指1.1倍半径的位置
#autopct,圆里面的文本格式,%3.1f%%表示小数有三位,整数有一位的浮点数
#shadow,饼是否有阴影
#startangle,起始角度,0,表示从0开始逆时针转,为第一块。一般选择从90度开始比较好看
#pctdistance,百分比的text离圆心的距离
#patches, l_texts, p_texts,为了得到饼图的返回值,p_texts饼图内部文本的,l_texts饼图外label的文本
#改变文本的大小
#方法是把每一个text遍历。调用set_size方法设置它的属性
for t in l_text:
    t.set_size=(30)
for t in p_text:
    t.set_size=(20)
# 设置x,y轴刻度一致,这样饼图才能是圆的
plt.axis('equal')
plt.legend()
plt.show()

注:
labelssizescolorsexplode的长度都要一样

3D图

1.导入3D图相关模块:

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

2.将画图板加到3D模块里,然后加入数据即可:

fig = plt.figure()
ax = Axes3D(fig)
ax.scatter(x, y, z)
plt.show()

3D散点图举例:

from random import randint
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

li_xyz = [(randint(0, 100), randint(0, 100), randint(0, 100)) for i in range(100)]
x, y, z = zip(*li_xyz)

fig = plt.figure()
ax = Axes3D(fig)
ax.scatter(x, y, z)
plt.show()

读取图片

通过imread()读取,举例:

from matplotlib.image import imread
file = r'2.jpg'
img = imread(file)
plt.imshow(img)
plt.show()
更多参考

https://blog.csdn.net/qq_34859482/article/details/80617391

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容