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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,875评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,569评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,475评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,459评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,537评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,563评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,580评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,326评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,773评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,086评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,252评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,921评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,566评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,190评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,435评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,129评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,125评论 2 352

推荐阅读更多精彩内容