Matplotlib基础教程

matplotlib

pyplot

Matplotlib库由各种可视化类构成,内部结构复杂,受Matlab启发

matplotlib.pyplot是绘制各类可视化图形的命令子库,相当于快捷方式

测试小实例

plt.plot() 只有一个输入列表或数组时,参数被当作Y轴,X轴以索引自动生成

当有两个以上参数时,按照X轴和Y轴顺序绘制数据点

plt.figure() 设置图片大小

plt.savefig() 将输出图形存储为文件,默认PNG格式,可以通过dpi修改输出质量

import matplotlib.pyplot as plt
plt.figure(figsize=(8,4),dpi=80)
plt.plot([0,2,4,6,8],[3,1,4,5,2])
plt.ylabel('Grade')
plt.axis([-1,10,0,6]) #确定x,y轴的范围
plt.savefig('test',dpi=600)
plt.show()
test.png
pyplot的绘图区域

plt.subplot(nrows, ncols, plot_number)

在全局绘图区域中创建一个分区体系,并定位到一个子绘图区域
plt.subplot(3,2,4) 简写形式:plt.subplot(324) 划分3*2个区,位于第4个绘图区

绘图区域.png

例1
f(t_1)=e^{t_1}cos(2{\pi}t_1)

f(t_2)=cos(2\pi t_2)

import matplotlib.pyplot as plt
import numpy as np
def  f(t):
    return np.exp(-t)*np.cos(2*np.pi*t)
a = np.arange(0,5,0.02)
plt.subplot(211)
plt.plot(a,f(a))
plt.subplot(212)
plt.plot(a,np.cos(2*np.pi*a),color='r', linestyle='--', marker='.') #等价于plt.plot(a,np.cos(2*np.pi*a),'r--.') 
plt.savefig('例1')
plt.show()
例1.png
pyplot中的plt.plot()函数
plt.plot(x, y, format_string, **kwargs)
x : X轴数据,列表或数组,可选
y : Y轴数据,列表或数组
format_string: 控制曲线的格式字符串,可选
**kwargs : 第二组或更多(x,y,format_string)

注意:当绘制多条曲线时,各条曲线的x不能省略。

例2

a = np.arange(10)
plt.plot(a,a*1.5,a,a*2.5,a,a*3.5,a,a*4.5)
plt.show()
例2.png

format_string: 控制曲线的格式字符串,由颜色字符、风格字符和标记字符组成,可选

颜色字符.png

风格字符.png

标记字符.png
a = np.arange(10)
plt.plot(a,a*1.5,'go:',a,a*2.5,'rx',a,a*3.5,'^',a,a*4.5,'bd-.')
plt.show()
例子2-1.png
pyplot的中文显示

方法一:

pyplot并不默认支持中文显示,需要rcParams修改字体实现

例3

import matplotlib
matplotlib.rcParams['font.family']='SimHei'
plt.plot([3,1,4,5,2])
plt.ylabel('纵轴(值)')
plt.savefig('test',dpi=600)
plt.show()
例3.png

rcParams的属性

属性 说明
'font.family' 用于显示字体的名字
'font.style' 字体风格,正常'normal'或 斜体'italic'
'font.size' 字体大小,整数字号或者'large'、'x‐small'

rcParams['font.family']

中文字体 说明
'SimHei' 中文黑体
'Kaiti' 中文楷体
'LiSu' 中文隶书
'FangSong' 中文仿宋
'YouYuan' 中文幼圆
'STSong' 华文宋体

例4

matplotlib.rcParams['font.family']='FangSong'
matplotlib.rcParams['font.size']=20
plt.rcParams['axes.unicode_minus']=False # 解决负号不显示乱码问题
a = np.arange(-2*np.pi,2*np.pi,0.02)
plt.xlabel('x轴')
plt.ylabel('y轴')
plt.subplot(111)
plt.plot(a,np.sin(4*a),'--',a,2*np.cos(4*a),'-.',a,3*np.sin(4*a),':',a,4*np.cos(4*a),'-')
plt.show()
例4.png

方法二:

在有中文输出的地方,增加一个属性:fontproperties

例5

a = np.arange(0,5,0.02)
plt.figure(figsize=(20,8),dpi=80) # 设置图形大小
plt.xlabel('横轴:时间',fontproperties='SimHei',fontsize=20)
plt.ylabel('纵轴:振幅',fontproperties='SimHei',fontsize=20)
plt.title('$f(a)=cos(2\pi a)$')
plt.plot(a,np.cos(2*np.pi*a))
plt.savefig('例5',dpi=600)
plt.show()
例5.png
刻度,标签,图例
  • 设置刻度范围

    plt.axis()

    plt.xlim(),plt.ylim()

    ax.set_xlim(),ax.set_ylim()

  • 设置显示的刻度

    plt.xticks(),plt.yticks()

    ax.set_xticks(),ax.set_yticks()

  • 设置刻度标签

    plt.xticklabels(),plt.yticklabels()

    ax.set_xticklabels(),ax.set_yticklabels()

  • 设置坐标轴标签

    plt.xlabel(),plt.ylabel()

    ax.set_xlabel(),ax.set_ylabel()

  • 设置标题

    plt.title()

    ax.set_title()

  • 图例

    ax.plot(label= '图例')

    ax.legend(),plt.legend()

    LOC = 'best':自动选择放置图例最佳位置

    'upper right' : 1,'upper left' : 2,'lower left' : 3,'lower right' :4

#划分子区域并实例化
fig, ax = plt.subplots(1)
#绘图
ax.plot(np.random.randn(1000).cumsum(), label='line0')
ax.plot(np.random.randn(1000).cumsum(), label='line1')
ax.plot(np.random.randn(1000).cumsum(), label='line2')
# 设置刻度
#plt.xlim([0,500])
ax.set_xlim([0, 600])

# 设置显示的刻度
#plt.xticks([0,500])
ax.set_xticks(range(0,500,100))

# 设置刻度标签
ax.set_yticklabels(['Jan', 'Feb', 'Mar'])

# 设置坐标轴标签
ax.set_xlabel('Number')
ax.set_ylabel('Month')

# 设置标题
ax.set_title('Example')

# 图例

ax.legend()
ax.legend(loc='best')
#plt.legend()
例6-0.png

pyplot的文本显示

函数 说明
plt.xlabel() 对X轴增加文本标签
plt.ylabel() 对Y轴增加文本标签
plt.title() 对图形整体增加文本标签
plt.text() 在任意位置增加文本
plt.annotate() 在图形中增加带箭头的注解

例6

a = np.arange(0,5,0.02)
plt.plot(a,np.cos(2*np.pi*a))
#plt.axis([-1,6,-2,2]) #设置x和y刻度范围
plt.xlim([-1,6]) #设置x刻度范围
plt.ylim([-2,2]) #设置y刻度范围
plt.xticks(np.arange(-1,6,1)) #设置显示的刻度
plt.yticks(np.arange(-2,2,1))
plt.xlabel('横轴:时间',fontproperties='SimHei',fontsize=15,color='green')
plt.ylabel('纵轴:振幅',fontproperties='SimHei',fontsize=15,color='red')
plt.title('正弦波实例 $y=cos(2\pi x)$',fontproperties='SimHei',fontsize=25)
plt.text(2,1.2,'$\mu=100$',fontsize=15)
plt.grid(alpha=0.6,linestyle='--',color='yellow') #调整网格透明度
plt.savefig('例6')
plt.show()
例6.png

例6-1

a = np.arange(0,5,0.02)
plt.plot(a,np.cos(2*np.pi*a),color='c',linestyle='--',linewidth=1.5)
plt.axis([-1,6,-2,2])
plt.xticks(np.arange(-1,6,1))
plt.yticks(np.arange(-2,2,1))
plt.xlabel('横轴:时间',fontproperties='SimHei',fontsize=15,color='green')
plt.ylabel('纵轴:振幅',fontproperties='SimHei',fontsize=15,color='red')
plt.title('正弦波实例 $y=cos(2\pi x)$',fontproperties='SimHei',fontsize=25)
plt.annotate('$\mu=100$',xy=(2,1),xytext=(3,1.5),fontsize=15
             ,arrowprops=dict(facecolor='black',shrink=0.1,width=1))
plt.grid(alpha=0.6,linestyle='--',color='yellow')
plt.savefig('例6-1')
plt.show()
例6-1.png

pyplot的基本图表函数

函数 说明
plt.plot(x,y,fmt,…) 绘制一个坐标图
plt.boxplot(data,notch,position) 绘制一个箱形图
plt.bar(left,height,width,bottom) 绘制一个条形图
plt.barh(width,bottom,left,height) 绘制一个横向条形图
plt.polar(theta, r) 绘制极坐标图
plt.pie(data, explode) 绘制饼图
plt.psd(x,NFFT=256,pad_to,Fs) 绘制功率谱密度图
plt.specgram(x,NFFT=256,pad_to,F) 绘制谱图
plt.cohere(x,y,NFFT=256,Fs) 绘制X‐Y的相关性函数
plt.scatter(x,y) 绘制散点图,其中,x和y长度相同
plt.step(x,y,where) 绘制步阶图
plt.hist(x,bins,normed) 绘制直方图
plt.contour(X,Y,Z,N) 绘制等值图
plt.vlines() 绘制垂直图
plt.stem(x,y,linefmt,markerfmt) 绘制柴火图
plt.plot_date() 绘制数据日期

常见的几种图表:

  • 饼状图:用扇形的面积,也就是圆心角的度数来表示数量。

    特点:显示一个数据系列中各项的大小与各项总和的比例。

  • 直方图:由一系列高度不等的纵向条纹或线段表示数据分布的情况。

    一般用横轴表示数据范围,纵轴表示分布情况。

    特点:绘制连续性的数据,展示一组或者多组数据的分布状况(统计)

  • 条形图:排列在工作表的列或行中的数据可以绘制到条形图中。

    特点:绘制连离散的数据,能够一眼看出各个数据的大小,比较数据之间的差别。(统计)

  • 散点图:用两组数据构成多个坐标点,考察坐标点的分布,判断两变量之间是否存在某种关联或总结坐标点的分布模式。

    特点:判断变量之间是否存在数量关联趋势,展示离群点(分布规律)

  • 折线图:以折线的上升或下降来表示统计数量的增减变化的统计图

    特点:能够显示数据的变化趋势,反映事物的变化情况。(变化)

饼状图的绘制
# 设置中文字体和负号正常显示
matplotlib.rcParams['font.family']='FangSong'
matplotlib.rcParams['axes.unicode_minus']=False
matplotlib.rcParams['font.size']=13
"""
绘制饼图
explode:设置各部分突出
labels:设置各部分标签
labeldistance:设置标签文本距圆心位置,1.1表示1.1倍半径
autopct:设置圆里面文本
shadow:设置是否有阴影
startangle:起始角度,默认从0开始逆时针转
pctdistance:设置圆内文本距圆心距离
"""
labels = ['衣','食','住','行']
sizes = [14.55,30.45,45,10]
colors = ['red','yellow','lightskyblue','green']
explode = (0,0.1,0,0)
# 设置图片大小
plt.figure(figsize=(7,4),dpi=80)
# 绘制饼状图图
plt.pie(sizes,labels=labels,colors=colors,explode=explode,labeldistance = 1.1,pctdistance = 0.6,autopct='%.2f%%',shadow=False,startangle=90)
plt.axis('equal') #使饼状图的xy轴长度相等
plt.legend(loc='best')
plt.savefig('饼状图')
plt.show()

饼状图.png
直方图的绘制
np.random.seed(0)
mu,sigma = 100,20
data = np.random.normal(mu,sigma,size=100)
"""
绘制直方图
data:必选参数,绘图数据
bins:直方图的长条形数目,可选项,默认为10
normed:是否将得到的直方图向量归一化,可选项,默认为0,代表不归一化,显示频数。normed=1,表示归一化,显示频率。
facecolor:长条形的颜色
edgecolor:长条形边框的颜色
alpha:透明度
histtype:直方图类型:'bar', 'barstacked','step', 'stepfilled'
"""
plt.hist(data,bins=20,normed=0,histtype='bar',facecolor='g',edgecolor="black",alpha=0.6)
# 显示横轴标签
plt.xlabel("区间",fontproperties='SimHei',fontsize=12)
# 显示纵轴标签
plt.ylabel("频数/频率",fontproperties='SimHei',fontsize=12)
# 显示图标题
plt.title('频数/频率分布直方图',fontproperties='SimHei')
plt.savefig('直方图')
plt.show()
直方图.png
条形图的绘制
matplotlib.rcParams['font.family']='SimHei'
matplotlib.rcParams['axes.unicode_minus']=False

label_list=['2015','2016','2017','2018'] #横坐标刻度显示值
num_list1=[20,30,15,35] # 纵轴坐标值1
num_list2=[15,30,40,20] #纵轴坐标值2
x = range(len(num_list1))
"""
绘制条形图
x:长条形中点横坐标
height:长条形高度
width:长条形宽度,默认值0.8
label:为后面设置legend准备
"""
plt.figure(figsize=(8,5),dpi=80)
rects1 = plt.bar(x,height=num_list1,width=0.4,alpha=0.7,color='red',label='测量部')
rects2 = plt.bar([i+0.4 for i in x],height=num_list2,width=0.4,alpha=0.7,color='blue',label='人事部')
plt.ylim(0,50)
plt.ylabel('人数')
"""
设置x轴刻度显示值
参数一:中点坐标
参数二:显示值
"""
plt.xticks([index+0.2 for index in x],label_list)
plt.xlabel('年份')
plt.title('某测绘公司')
#编辑文本
for rect in rects1:
    height = rect.get_height()
    plt.text(rect.get_x()+rect.get_width()/2,height+1,str(height),ha='center',va='bottom')
for rect in rects2:
    height = rect.get_height()
    plt.text(rect.get_x()+rect.get_width()/2,height+1,str(height),ha='center',va='bottom')
plt.legend()
plt.savefig('条形图')
plt.show()
条形图.png
水平条形图的绘制
matplotlib.rcParams['font.family'] = 'SimHei'
matplotlib.rcParams['axes.unicode_minus'] = False

price = [39.5,44.2,36.7,38.9,33.33]
"""
绘制水平条形图方法barh
参数一:y轴
参数二:x轴
"""
plt.figure(figsize=(8,5),dpi=80)
_price = plt.barh(range(5),price,height=0.6,color='cyan',alpha=0.7)
plt.yticks(range(5),['亚马逊','当当网','中国图书网','京东','天猫图书'])
plt.xlim(30,47)
plt.xlabel('价格')
plt.title('不同平台的图书价格')
plt.grid(alpha=0.2)
#编辑文本
for x in _price:
    width = x.get_width()
    plt.text(width+1,x.get_y()+x.get_height()/2,str(width),ha='center',va='center')
plt.savefig('水平条形图')
plt.show()
水平条形图.png
堆叠条形图的绘制
matplotlib.rcParams['font.family']='SimHei'
matplotlib.rcParams['axes.unicode_minus']=False

label_list=['2015','2016','2017','2018'] #横坐标刻度显示值
num_list1=[20,30,15,35] # 纵坐标值1
num_list2=[15,30,40,20] #轴坐标值2
x = range(len(num_list1))
"""
绘制条形图
x:长条形中点横坐标
height:长条形高度
width:长条形宽度,默认值0.8
label:为后面设置legend准备
"""
plt.figure(figsize=(8,6),dpi=80)
rects1 = plt.bar(x,height=num_list1,width=0.6,alpha=0.7,color='red',label='测量部')
rects2 = plt.bar([i for i in x],height=num_list2,width=0.6,alpha=0.7,color='blue',label='人事部', bottom=num_list1)
plt.ylim(0,90)
plt.yticks(np.arange(0,90,15))
plt.ylabel('人数')
"""
设置x轴刻度显示值
参数一:中点坐标
参数二:显示值
"""
plt.xticks([index for index in x],label_list)
plt.xlabel('年份')
plt.title('某测绘公司')
plt.legend()
plt.grid(alpha=0.3)
plt.savefig('堆叠条形图')
plt.show()
堆叠条形图.png
散点图的绘制

方法一:使用plt.scatter()函数

plt.figure(figsize=(10,4),dpi=80)
np.random.seed(1)
a=10*np.random.randn(100)
b=10*np.random.randn(100)
plt.scatter(a,b,c='red',marker='o',alpha=0.8)
plt.scatter(0.8*a,2*b,c='cyan',marker='^')
plt.title('散点图1')
plt.savefig('散点图1')
plt.show()
散点图1.png

方法二:使用plt.plot()函数

plt.figure(figsize=(10,4),dpi=80)
np.random.seed(1)
a=10*np.random.randn(100)
b=10*np.random.randn(100)
c=10*np.random.randn(100)
d=10*np.random.randn(100)
plt.plot(a,b,'go',c,d,'b^')
plt.title('散点图2')
plt.savefig('散点图2')
plt.show()
散点图2.png
折线图的绘制

注意:使用plt.plot()函数,若离散的y与x的长度相同;若y为连续函数则可以与x长度不同。

matplotlib.rcParams['font.family']='SimHei'
a=np.arange(0,30,1)
print(a)
data=np.random.uniform(0,30,30).reshape(30)
print(data)
data0=np.random.uniform(0,30,30).reshape(30)
print(data0)
plt.plot(a,data,'g--*',a,data0,'r:.')
plt.ylabel('纵轴(值)')
plt.savefig('折线图',dpi=600)
plt.show()
折线图.png

参考资料:

网址:https://blog.csdn.net/hohaizx/article/details/79101322

书籍:《利用python进行数据分析》

视频:《黑马程序员之数据分析》《python数据分析与展示》

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