Matplotlib是python最著名的绘图库,由各种可视化类构成。
Matplotlib 是一个 Python 的 2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形。通过 Matplotlib,开发者可以仅需要几行代码,便可以生成绘图,直方图,功率谱,条形图,错误图,散点图等。
我们可以提前先看一个柱状效果图:
import numpy as np
import matplotlib.pyplot as plt # 导入库
N = 5
menMeans = (20,35,30,35,27) #数据值
womenMeans = (25,32,34,20,25)
menStd =(2,3,4,1,2)
womenStd = (3,5,2,3,3)
ind = np.arange(N) #将X轴分为组
width = 0.35 #柱状图的宽度
p1=plt.bar(ind,menMeans,width,yerr=menStd)
p2=plt.bar(ind,womenMeans,width,bottom=menMeans,yerr=womenStd) # p2在p1柱状图上累加
plt.ylabel("Scores") # y轴标签
plt.title("Scores by group and gender") # 图表标题
plt.xticks(ind,("G1","G2","G3","G4","G5")) # x轴分组标签
plt.yticks(np.arange(0,81,10))
plt.legend((p1[0],p2[0]),("Men","Women")) # 图例
plt.show()
1、Matplotlib中函数库通过如下语句载入:
import matplotlib.pyplot as plt # 导入库
2、调用figure创建一个绘图对象,通过figsize参数可以指定绘图对象的宽和高,也可以不创建绘图对象直接调用plot函数直接绘图,matplotlib会自动创建一个绘图对象。
plt.figure(figsize=(8,4))
3、plot函数调用方式灵活,使用关键字参数指定各种属性:
可通过一系列函数设置对象的各个属性:
xlabel、ylabel:设置x、y轴的文字
title:设置图标的标题
ylim:设置y轴的范围
legend:图例显示
plt.show():显示出绘图对象
可以调用plt.savefig()将当前的Figure对象保存成图像文件,图像格式可以设置png:,dpi:分辨率
plt.savefig("test.png",dpi=120)
快速绘图示例:
import numpy as np
import matplotlib.pyplot as plt # 导入库#
x = np.linspace(0,10,500) #数据准备 x为500个数,数据密集,图像光滑
y = np.sin(x)
z = np.cos(x**2)
plt.figure(figsize=(8,6)) #设置绘图的宽、高
# 设置曲线属性
plt.plot(x,y,"r-",label="$sin(x)$",linewidth=2)
plt.plot(x,z,"b--",label="$cos(x^2)$",linewidth=2)
plt.xlabel("Time(s)") # x轴文字
plt.ylabel("Volt") # y轴文字
plt.title("Pyplot First Example") # 图表标题
plt.ylim(-1.2,1.2) #y值范围
plt.legend() #图例显示 label
plt.show()
#plt.savefig("test1.png",dpi=120) #在同目录下生成png文件
import numpy as np
import matplotlib.pyplot as plt # 导入库#
x = np.linspace(0,10,500) #数据准备
y = np.sin(x)
z = np.cos(x**2)
N = 5
menMeans = (20,35,30,35,27) #数据值
womenMeans = (25,32,34,20,25)
menStd =(2,3,4,1,2)
womenStd = (3,5,2,3,3)
ind = np.arange(N) #将X轴分为组
width = 0.35 #柱状图的宽度
plt.subplot(2,1,1)
plt.bar(ind,menMeans,width,yerr=menStd,label="Men")
plt.bar(ind,womenMeans,width,bottom=menMeans,yerr=womenStd,label="Women") # p2在p1柱状图上累加
plt.ylabel("Scores") # y轴标签
plt.title("Scores by group and gender") # 图表标题
plt.xticks(ind,("G1","G2","G3","G4","G5")) # x轴分组标签
plt.yticks(np.arange(0,81,10))
plt.legend(loc="upper right", fontsize = 8, borderaxespad= 0.3) #设置图例位置、大小、图例边框的内边距
plt.subplot(2,1,2)
plt.plot(x,y,"r-",label="$sin(x)$",linewidth=2)
plt.plot(x,z,"b--",label="$cos(x^2)$",linewidth=2)
"""
1.tight_layout命令:主要用于自动调整绘图区的大小及间距,
使所有的绘图区及其标题、坐标轴标签等都可以不重叠的完整显示在画布上。
2、tight_layout命令还有三个关键字参数:pad、w_pad、h_pad。
pad用于设置绘图区边缘与画布边缘的距离大小
w_pad用于设置绘图区间水平距离的大小
h_pad用于设置绘图区间垂直距离的大小
"""
plt.tight_layout(pad=2, w_pad=3.0, h_pad=3.0)
plt.show()
# plt.savefig("test1.png",dpi=120) #在同目录下生成png文件
绘制多条曲线、曲线颜色、线型、标记等参数设置
import matplotlib.pyplot as plt # 导入库
#随机取得数据
yy = [1,2,3,4,5,3,1,2,7,8]
xx = [2,3,4,6,7,8,6,4,3,3]
zz = [2,2,3,6,8,3,2,7,8,6]
# 设置属性linewidth,linestyle等关键词不能出错
plt.plot(yy,color="r",linewidth=5,linestyle=":",label="Data 1")
plt.plot(xx,color="g",linewidth=2,linestyle="--",label="Data 2")
plt.plot(zz,color="b",linewidth=0.5,linestyle="-",label="Data 3")
plt.legend(loc=2) #设置图例位置
plt.xlabel("X轴名称",fontproperties="simhei") #注意设置中文字体fontproperties="simhei"
plt.ylabel("Y轴名称",fontproperties="simhei")
plt.title("折线图美化示例",fontproperties="simhei")
plt.ylim(0,10) # y轴范围
plt.show()
显示如下:
折线图实战案例1:
已知某小吃店2018年每个月份的营业额如下表所示。请用matplotlib扩展库编写程序绘制折线图对该小吃店全年营业额进行可视化,并用红色点划线连接每个月份的数据,并在每个月份的数据处使用三角形标记。
代码如下:
import matplotlib.pyplot as plt # 导入库
month = list(range(1,13)) #range左闭右开
money = [5.2,2.7,5.8,5.7,7.3,9.2,18.7,15.6,20.5,18.0,7.8,6.9]
plt.plot(month,money,"b--^") # 横纵坐标、颜色、线型、标记
plt.xlabel("月份",fontproperties="simhei",fontsize=14)
plt.xlabel("营业额(万元)",fontproperties="simhei",fontsize=14)
plt.title("小吃店2018年营业额变化趋势图",fontproperties="simhei",fontsize=18)
plt.tight_layout() #紧缩四周空白,扩大绘图区域可用面积
plt.show()
matplotlib.pyplot.scatter(x,y,s=None,c=None,maker=None,norm=None,vmin=None,
vmax=None,alpha=None,linewidths=None,verts=None,
edgecolor=None,hold=None,data=None,)
绘制普通散点图
import numpy as np
import matplotlib.pyplot as plt
#10个点
N=10
x = np.random.rand(N)
y = np.random.rand(N)
plt.scatter(x,y)
plt.show()
import numpy as np
import matplotlib.pyplot as plt
#10个点
N=10
x = np.random.rand(N)
y = np.random.rand(N)
# 每个点设置随机大小
area=(30*np.random.rand(N))**1.5
plt.scatter(x,y,s=area)
plt.show()
import numpy as np
import matplotlib.pyplot as plt
#10个点
N=10
x = np.random.rand(N)
y = np.random.rand(N)
# 每个点设置随机大小
area=(30*np.random.rand(N))**1.5
# 颜色随机
color=np.random.rand(N)
plt.scatter(x,y,s=area,c=color,alpha=0.6) #alpha设置透明度
plt.show()
import numpy as np
import matplotlib.pyplot as plt
#10个点
N=10
x = np.random.rand(N)
y = np.random.rand(N)
# 每个点设置随机大小
area=(30*np.random.rand(N))**1.5
# 颜色随机
color=np.random.rand(N)
plt.scatter(x,y,s=area,c=color,alpha=0.6,marker="^") #alpha设置透明度 marker设置散点形状
plt.show()
import numpy as np
import matplotlib.pyplot as plt
#10个点
N=10
x1 = np.random.rand(N)
y1 = np.random.rand(N)
x2 = np.random.rand(N)
y2 = np.random.rand(N)
# 每个点设置随机大小
area=(30*np.random.rand(N))**1.5
# 颜色随机
color=np.random.rand(N)
plt.scatter(x1,y1,s=area,c=color,alpha=0.6,marker="^",label="circle") #alpha设置透明度 marker设置散点形状
plt.scatter(x2,y2,s=area,c=color,alpha=0.6,marker="o",label="triangle") #label设置图例
plt.legend(loc="best")
plt.show()
在matplotlib中使用函数matplotlib.pyplot.barr绘制散点图
主要参数:
可选参数:
简单柱状图
import matplotlib.pyplot as plt
name_list = ["Monday","Tuesday","Friday","Sunday"]
num_list = [2,0.6,6,9]
plt.bar(range(len(num_list)),num_list,color="rgbc",tick_label=name_list) # x轴分组,y值,柱子颜色,柱子下标
plt.show()
import matplotlib.pyplot as plt
name_list = ["Monday","Tuesday","Friday","Sunday"]
num_list = [2,0.6,6,9]
plt.barh(range(len(num_list)),num_list,color="rgbc",tick_label=name_list) # x轴分组,y值,柱子颜色,柱子下标
plt.show()
import matplotlib.pyplot as plt
name_list = ["Monday","Tuesday","Friday","Sunday"]
num_list = [2,0.6,6,9]
num_list1 = [3,1,2,1]
plt.bar(range(len(num_list)),num_list,color="r",tick_label=name_list,label="boy") # x轴分组,y值,柱子颜色,柱子下标
plt.bar(range(len(num_list)),num_list1,color="b",tick_label=name_list,bottom=num_list,label="girl")
plt.legend(loc="best") #显示图例
plt.show()
import matplotlib.pyplot as plt
name_list = ["Monday","Tuesday","Friday","Sunday"]
num_list = [2,0.6,6,9]
num_list1 = [3,1,2,1]
x=list(range(len(num_list)))
total_width = 0.8 # 并列柱状图总宽度
n= 2 # 并列n个柱子
width = total_width/n # 每根柱子宽度
plt.bar(x,num_list,width=width,color="r",tick_label=name_list,label="boy") # x轴分组,y值,柱子颜色,柱子下标
for i in range(len(x)): # 为第二个柱状图划分x轴组
x[i] = x[i] + width
plt.bar(x,num_list1,width=width,color="b",tick_label=name_list,label="girl")
plt.legend(loc="best") #显示图例
plt.show()
import matplotlib.pyplot as plt
import pandas as pd
import matplotlib.font_manager as fm
data = pd.DataFrame({
"月份":[1,2,3,4,5,6,7,8,9,10,11,12],
"男装":[51,32,58,57,30,46,38,38,40,53,58,50],
"女装":[70,30,48,73,82,80,43,25,30,49,79,60],
"餐饮":[60,40,46,50,57,76,70,33,70,61,49,45],
"化妆品":[110,75,130,80,83,95,87,89,96,88,86,89],
"金银首饰":[143,100,89,90,78,129,100,97,108,152,96,87]})
data.plot(x="月份",kind="bar") # 绘制柱状图,指定月份为x轴
plt.xlabel("月份",fontproperties="simhei")
plt.ylabel("营业额(万元)",fontproperties="simhei")
myfont=fm.FontProperties(fname="C:\Windows\Fonts\STFANGSO.TTF") #Matplotlib的字体管理 将字体路径复制到这里
plt.legend(prop=myfont)
plt.show()
饼状图显示一个系列中各的大小与各项总和的比例。可自动根据数据的百分比画饼。
绘制饼状图的基本语法:
参数设置:
饼状图实战1:
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
labels = 'A','B','C','D'
sizes = [10,20,30,40]
explode = (0, 0.1, 0, 0)
colors=['r', 'g','b','c']
# 数据、标签、离中心点距离、颜色、百分比设置
plt.pie(sizes, labels = labels, explode = explode, colors = colors, autopct = '%1.2f%%')
plt.title('简单饼状图')
plt.legend(loc="upper right", fontsize = 8, borderaxespad= 0.3) #设置图例位置、大小、图例边框的内边距
plt.show()
饼状图实战2:
from itertools import groupby
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"]=["SimHei"]
# 每门课程的成绩用字典存储
scores = {
"操作系统":[89,70,49,87,92,84,73,62,78,81,90,65,77,82,81,79,80],
"高等数学":[70,74,80,60,50,87,68,77,95,80,79,74,69,64,82,81],
"英语":[83,87,69,55,80,89,96,81,83,90,54,70,79,66,85,82],
"python编程":[90,60,82,79,88,92,85,87,89,71,45,50,80,81,87,93]}
# 自定义分组函数,在下面的groupby()函数中使用
def splitScore(score):
if score >= 85:
return "优"
elif score >= 70:
return "良"
elif score >= 60:
return "及格"
else:
return "不及格"
# 统计每门课程中优、及格、不及格
# ratios的格式为{"课程名称":{“优”:3,“及格”:5,“不及格”:1},...}
ratios = dict()
for subject,subjectScore in scores.items():
ratios[subject]={
}
#groupby函数需要对原始分数进行排序才能正确分类
for category,num in groupby(sorted(subjectScore),splitScore):
ratios[subject][category] = len(tuple(num))
# 创建4个子图
# 依次在4个子图中绘制每门课程的饼状图
for index,subjectData in enumerate(ratios.items()):
# 选择子图
plt.subplot(2,2,index+1) # index不能为0,则+1
subjectName,subjectRatio = subjectData
plt.pie(list(subjectRatio.values()),
labels=list(subjectRatio.keys()),
autopct="%1.1f%%")
plt.xlabel(subjectName)
plt.tight_layout(pad=2, w_pad=3.0, h_pad=3.0)
plt.show()