matplotlib:Python图形绘图库,将数据进行可视化,更直观的呈现
使数据更客观、更有说服力
首先,导入Matplotlib包中的Pyplot模块
from matplotlib import pyplot as plt
基本框架
from matplotlib import pyplot as plt
import numpy as np
x=np.arange(-50,50)
y=x **2
#绘制图形
plt.plot(x,y)
plt.show()
基本方法
1.plt.title()
from matplotlib import pyplot as plt
import numpy as np
x=np.arange(-50,50)
y=x **2
#标题
plt.title("y=x^2")
plt.plot(x,y)
plt.show()
默认标题不支持中文,修改字体设置
方法一:导入黑体
下载SimHei字体
解决中文乱码
from matplotlib import pyplot as plt
import numpy as np
x=np.arange(-50,50)
y=x **2
plt.rcParams['font.sans-serif']=["SimHei"]
plt.title("y等于x的平方")
plt.rcParams['axes.unicode_minus']=False
#绘制图形
plt.plot(x,y)
plt.show()
方法二:
plt.rcParams["font.sans-serif"]
则上面改为
from matplotlib import pyplot as plt
import numpy as np
x=np.arange(-50,50)
y=x **2
plt.rcParams['font.sans-serif']=["SimHei"]
plt.title("y等于x的平方")
#绘制图形
plt.plot(x,y)
plt.show()
但是负号无法展现
修改轴中的负号编码
plt.rcParams['axes.unicode_minus']=False
from matplotlib import pyplot as plt
import numpy as np
x=np.arange(-50,50)
y=x **2
plt.rcParams['font.sans-serif']=["SimHei"]
plt.title("y等于x的平方")
plt.rcParams['axes.unicode_minus']=False
#绘制图形
plt.plot(x,y)
plt.show()
2.x和y轴名称
plt.xlable()
plt.ylable()
from matplotlib import pyplot as plt
import numpy as np
x=np.arange(-50,50)
y=x **2
plt.rcParams['font.sans-serif']=["SimHei"]
plt.title("y等于x的平方")
plt.rcParams['axes.unicode_minus']=False
#设置x和y轴名称
plt.xlabel("x轴")
plt.ylabel("y轴")
plt.plot(x,y)
plt.show()
3.设置标签文字大小
fontsize参数:设置文字大小
linewidth参数:设置线条
from matplotlib import pyplot as plt
import numpy as np
x=np.arange(-50,50)
y=x **2
plt.rcParams['font.sans-serif']=["SimHei"]
plt.title("y等于x的平方",fontsize=16)
plt.rcParams['axes.unicode_minus']=False
#设置x和y轴名称字体大小
plt.xlabel("x轴",fontsize=16)
plt.ylabel("y轴",fontsize=16)
#设置线条宽度
plt.plot(x,y,linewidth=5)
plt.show()
绘制多个图像
from matplotlib import pyplot as plt
import numpy as np
x=np.arange(-10,10)
y1=x **2
y2=x+1
plt.xlabel("x",fontsize=12)
plt.ylabel("y")
plt.plot(x,y1)
plt.plot(x,y2)
plt.show()
4.设置x和y的刻度
xticks
- ticks:此参数是xtick位置的列表,和一个可选参数,如果将一个空列表作为参数传递,则它将删除所有xticks
- labels:把显示的数据替换
- rotation旋转角度
- color颜色
from matplotlib import pyplot as plt
import numpy as np
x=np.arange(-10,10)
y1=x **2
y2=x+1
plt.xlabel("x",fontsize=12)
plt.ylabel("y")
#间隔一个显示
plt.xticks(range(-10,10,2))
plt.plot(x,y1)
plt.plot(x,y2)
plt.show()
from matplotlib import pyplot as plt
import numpy as np
x=np.arange(-10,10)
y1=x **2
y2=x+1
plt.xlabel("x",fontsize=12)
plt.ylabel("y")
#labels设置
plt.xticks(range(-10,10,2),labels=[1,2,3,4,5,6,7,8,9,10])
plt.plot(x,y1)
plt.plot(x,y2)
plt.show()
from matplotlib import pyplot as plt
import numpy as np
x=np.arange(-10,10)
y1=x **2
y2=x+1
plt.xlabel("x",fontsize=12)
plt.ylabel("y")
#label设置
plt.rcParams['font.sans-serif']=["SimHei"]
plt.rcParams['axes.unicode_minus']=False
x_ticks=range(-10,10,2)
x_labels=['%s度'%i for i in x_ticks]
plt.xticks(x_ticks,x_labels,rotation=45)
plt.plot(x,y1)
plt.plot(x,y2)
plt.show()
5.图例
集中地图一角或一侧的地图上各种符号和颜色所代表内容与制表的说明
from matplotlib import pyplot as plt
import numpy as np
x=np.arange(-10,10)
y1=x **2
y2=x+1
plt.xlabel("x",fontsize=12)
plt.ylabel("y")
plt.rcParams['font.sans-serif']=["SimHei"]
plt.rcParams['axes.unicode_minus']=False
x_ticks=range(-10,10,2)
x_labels=['%s度'%i for i in x_ticks]
plt.xticks(x_ticks,x_labels,rotation=45)
#给线起label名称
plt.plot(x,y1,label="收入")
plt.plot(x,y2,label="支出")
#默认会使用图形的label值作为图例的说明
plt.legend()
plt.show()
可以自己设置图示的位置
loc=
from matplotlib import pyplot as plt
import numpy as np
x=np.arange(-10,10)
y1=x **2
y2=x+1
plt.xlabel("x",fontsize=12)
plt.ylabel("y")
plt.rcParams['font.sans-serif']=["SimHei"]
plt.rcParams['axes.unicode_minus']=False
x_ticks=range(-10,10,2)
x_labels=['%s度'%i for i in x_ticks]
plt.xticks(x_ticks,x_labels,rotation=45)
plt.plot(x,y1,label="收入")
plt.plot(x,y2,label="支出")
#设置图示的位置为center
plt.legend(loc='center')
plt.show()
6.其它元素可视性
6.1.显示网格grid()
plt.grid()
- 显示网格
- linestyle:线型
- color:颜色
- linewidth:宽度
- axis:x,y,both,显示x/y两者的格网
from matplotlib import pyplot as plt
import numpy as np
x=np.arange(10)
y=x **2
plt.plot(x,y)
# 显示网格线,虚线,颜色,宽度,只显示x轴的
plt.grid(linestyle="--",color="gray",linewidth="0.5",axis='x')
plt.show()
6.2.plt.gca()获取坐标轴变量,对坐标轴的操作
plt.spines黑色边框线,分top,bottom,left,right
用plt.gca().spines["right"]
获取一边框
移动:
postion位置参数有三种,
- data数值移动,其后数字代表挪动到y轴的刻度值
- outward向外移动
- axes:0.0-1.0之间,整个轴上的比例
from matplotlib import pyplot as plt
import numpy as np
x=np.arange(10)
y=x **2
plt.plot(x,y)
#获取当前坐标轴
ax=plt.gca()
#通过坐标轴spines,可以设置颜色
ax.spines["right"].set_color("none")
ax.spines["top"].set_color("none")
#移动下轴到指定位置
#
ax.spines["left"].set_position(("axes",0.5))
plt.show()
from matplotlib import pyplot as plt
import numpy as np
x=np.arange(10)
y=x **2
plt.plot(x,y)
#获取当前坐标轴
ax=plt.gca()
ax.spines["right"].set_color("none")
ax.spines["top"].set_color("none")
#指定 data 设置的bottom(也就是指定的x轴)绑定到y轴的0这个点上
ax.spines["bottom"].set_position(("data",0.0))
plt.show()
7.设置图片大小figure
创建图形对象
plt.figure(
num=None,#图像编号或名称
figsize=None,#指定宽和高
dpi=None,#分辨率,即每英寸多少个像素
facecolor=None,#背景颜色
edgecolor=None,#边框颜色
frameon=True,#是否显示边框
)
plt.figure()里面传入参数,figsize元组,长宽
图像模糊时可以传入dpi参数,让图片更清晰
8.图片保存savefig
from matplotlib import pyplot as plt
import numpy as np
x=range(2,26,2)
y=[15,13,14,27,20,25,26,26,24,22,18,15]
#设置图片大小
plt.figure(figsize=(20,8),dpi=80,facecolor='gray')
#传入x和y,通过plot绘制折线图
plt.plot(x,y)
#保存图片为svg矢量图格式,放大不会有锯齿
plt.savefig("./t1.png")
#展示图形
plt.show()
一、折线图
坐标连接成线
准备好要画的点x坐标的值,y坐标的值
from matplotlib import pyplot as plt
import numpy as np
x=range(2,26,2)
y=[15,13,14,27,20,25,26,26,24,22,18,15]
#传入x和y,通过plot绘制折线图
plt.plot(x,y)
#展示图形
plt.show()
绘制多子图
figure是绘制对象(相当于画布),一个figure对象可以包含多个Axes子图
1.add_axes(rect)添加区域
生成一个axes轴域对象,对象的位置又参数rect决定
rect位置参数,接受一个4个元素组成的浮点数列表,形如[left,bottom,width,height]
,它表示添加到画布中的左下角坐标(x,y)以及宽度和高度
from matplotlib import pyplot as plt
import numpy as np
x=np.arange(10)
y=x **2
fig=plt.figure(figsize=(4,2),facecolor='g')
ax1=fig.add_axes([0,0,1,1])
#从画布20%的位置开始绘制,宽高是画布的50%
ax2=fig.add_axes([0.2,0.2,0.5,0.5])
plt.plot(x,y)
#区域.plot()
ax1.plot(x,y)
ax2.plot(x,y)
#展示图形
plt.show()
2.subplot()函数,均等划分画布
ax=plt.subplot(行,列,位置)
from matplotlib import pyplot as plt
import numpy as np
#划分分隔为两行一列,当前处于第一区域
plt.subplot(211)
x=np.arange(10)
y=x **2
plt.plot(x,y)
#划分分隔为两行一列,当前处于第二区域
plt.subplot(212)
y1=x+1
plt.plot(x,y1)
#展示图形
plt.show()
3.subplots()不仅创建包含子图区域的画布,又创建一个figure图形对象,而subplot()只是创建一个包含子图区域的画布
from matplotlib import pyplot as plt
import numpy as np
fig,axes=plt.subplots(2,2)
ax1=axes[0][0]
x=np.arange(1,5)
ax1.plot(x,x*x)
axes[0][1].plot(x,np.log10(x))
#展示图形
plt.show()
二、条形图
使用plt.bar(x,height,width:float=0.8,bottom=None,*,align:str='center',data=None)
参数 | 含义 |
---|---|
x | 数据类型为float类型,一般为np.arange()生成 |
height | y坐标值,float |
width | 柱状图的高度,0-1之间 |
bottom | 柱状图的起始位置,y的起始坐标 |
align | 柱状图的中心位置 |
color | 颜色 |
alpha | 透明度,0-1 |
label | 设置后需调用plt.legend()生成 |
edgecolor/ec | 边框颜色 |
linewidth/lw | 边框宽度 |
tick_label | 柱子的刻度标签,字符串或字符串列表 |
linestyle/ls | 线条样式 |
from matplotlib import pyplot as plt
x=range(5)
data=[5,10,25,30,45]
plt.rcParams['font.sans-serif']=["SimHei"]
plt.title('柱状图')
plt.grid(ls='--',alpha=0)
plt.bar(x,data,color=['r','g','b'])
plt.show()
from matplotlib import pyplot as plt
x=range(5)
data=[5,10,25,30,45]
plt.rcParams['font.sans-serif']=["SimHei"]
plt.title('柱状图')
plt.grid(ls='--',alpha=0)
plt.bar(x,data,edgecolor='r',linestyle='--',linewidth=2)
plt.show()
1.同位置多柱状图
from matplotlib import pyplot as plt
import numpy as np
countries=['中国','美国','韩国']
plt.rcParams['font.sans-serif']=["SimHei"]
gold=[18,12,1]
silver=[3,1,2]
bronze=[13,2,3]
#得到横坐标列表
x=np.arange(len(countries))
width=0.2
gold_x=x
silver_x=x+width
bronze_x=x+width*2
#对应坐标,颜色,宽度
#横坐标会变
plt.bar(gold_x,gold,color='gold',width=width)
plt.bar(silver_x,silver,color='silver',width=width)
plt.bar(bronze_x,bronze,color='red',width=width)
#X轴向右移,值换成国家
plt.xticks(x+width,labels=countries)
plt.show()
2.堆叠柱状图
from matplotlib import pyplot as plt
import numpy as np
countries=['中国','美国','韩国']
plt.rcParams['font.sans-serif']=["SimHei"]
gold=np.array([18,12,1])
silver=np.array([3,1,2])
bronze=np.array([13,2,3])
x=np.arange(len(countries))
width=0.2
#横坐标对应国家,是bottom值是叠加
plt.bar(countries,gold,color='gold',bottom=bronze+silver,width=width)
plt.bar(countries,silver,color='silver',width=width,bottom=bronze)
plt.bar(countries,bronze,color='red',width=width)
plt.xticks(x,labels=countries)
plt.show()
三、水平条形图barth()
一、水平条形图条形图
barh()函数,和bar()函数类似,只是它使用y参数传入y轴数据,width传入条柱宽度数据
from matplotlib import pyplot as plt
import numpy as np
countries=['中国','美国','韩国']
plt.rcParams['font.sans-serif']=["SimHei"]
gold=np.array([8,2,1])
plt.barh(countries,width=gold)
plt.show()
1.堆叠
from matplotlib import pyplot as plt
import numpy as np
countries=['中国','美国','韩国']
plt.rcParams['font.sans-serif']=["SimHei"]
gold=np.array([18,12,1])
silver=np.array([3,1,2])
bronze=np.array([13,2,3])
width=0.2
#y坐标对应城市,然后需要依次向右移动
plt.barh(countries,gold,color='gold',left=bronze+silver,height=width)
plt.barh(countries,silver,color='silver',height=width,left=bronze)
plt.barh(countries,bronze,color='red',height=width)
plt.show()
2.多位置
from matplotlib import pyplot as plt
import numpy as np
countries=['中国','美国','韩国']
gold=np.array([18,12,1])
silver=np.array([3,1,2])
bronze=np.array([13,2,3])
width=0.2
y=np.arange(len(countries))
gold_y=gold
silver_y=silver+width
bronze_y=bronze+width*2
#y坐标,依次向上移,宽度也就是对应数量,设置颜色,高度就是设置条形图的宽度
plt.barh(y,gold_y,color='gold',height=width)
plt.barh(y+width,silver,color='silver',height=width)
plt.barh(y+2*width,bronze,color='red',height=width)
#y轴向右移,值换成国家
plt.yticks(y+width,countries)
plt.show()
四、直方图plt.hist()
又称质量分布图,是条形图的一种,由一系列高度不等的纵向线段来表示数据发
直方图用于概率分布,显示一组数值序列在给定数值范围内出现的概率(连续数据分布,一定顺序),而柱状图展示各个类别的频数(离散数据)
plt.hist()
值 | 表示和要求 |
---|---|
x | 直方图所要用的数据,必须是一维数据;多维数组可以先进行扁平化再作图;必选参数 |
bins | 直方图的柱数,即要分的组数,默认为10 |
weights | 与x形状相同的权重数组;将x中的每个元家乘以对应权重值再计数;如果nomed或density取值为True,则会对权重进行归一化处理。这个参数可用于绘制已合并的数据的直方图 |
density | 布尔,可选。如果"True”,返回元组的第一个元素将会将计数标准化以形成一个概率密度,也就是说,直方图下的面积(或积分)总和为1。这是通过将计数除以数字的数量来实现的观察乘以箱子的宽度而不是除以总数数量的观察。如果相加也是"真实”的,那么柱状图被规范化为1。(替代normed) |
bottom | 数组,标量值或None;每个柱子底部相对于y=0的位置。如果是标量值,则每个柱子相对于y=0向上/向下的偏移量相同。如果是数组,则根据数组元素取值移动对应的柱子:即直方图上下便宜距离 |
histype | {'bar,'barstacked,'step,'stepiled”;"ba“是传统的条形直方图;"barstacked’是堆叠的条形直方图;'step’是未填充的条形直方图,只有外边框;‘stepiled"是有填充的直方图;当histype取值为’step’或’stepfiled’,ridth设置失效,即不能指定柱子之间的间隔,默认连接在一起 |
align | {"let, mid, right};“left:柱子的中心位于bins的左边缘;'mid”:柱子位于bins左右边缘之间;right’:柱子的中心位于bins的右边缘;、color |
label | 字符申(序列)或None;有多个数据集时,用label参数做标注区分 |
normed | 是否将得到的直方图向量归一化,即显示占比,默认为0,不归一化;不推荐使用,建议改用density参数: |
edgecolor | 直方图边框颜色: |
alpha | 透明度 |
from matplotlib import pyplot as plt
import numpy as np
x=np.random.randint(140,180,300)
plt.hist(x,bins=10,edgecolor='white')
plt.rcParams['font.sans-serif']=["SimHei"]
plt.title('数据统计')
plt.xlabel('身高')
plt.ylabel('比率')
plt.show()
from matplotlib import pyplot as plt
import numpy as np
x=np.random.randint(140,180,300)
num,bins,pathches=plt.hist(x,bins=10,edgecolor='white')
#num最上方值,bins柱状图起始值,
print(num,bins,pathches)
'''[23. 18. 27. 32. 47. 21. 32. 36. 29. 35.]
[140. 143.9 147.8 151.7 155.6 159.5 163.4 167.3 171.2 175.1 179. ]
<BarContainer object of 10 artists>'''
for p in pathches:
print(p)
'''Rectangle(xy=(140, 0), width=3.9, height=23, angle=0)
Rectangle(xy=(143.9, 0), width=3.9, height=18, angle=0)
Rectangle(xy=(147.8, 0), width=3.9, height=27, angle=0)
Rectangle(xy=(151.7, 0), width=3.9, height=32, angle=0)
Rectangle(xy=(155.6, 0), width=3.9, height=47, angle=0)
Rectangle(xy=(159.5, 0), width=3.9, height=21, angle=0)
Rectangle(xy=(163.4, 0), width=3.9, height=32, angle=0)
Rectangle(xy=(167.3, 0), width=3.9, height=36, angle=0)
Rectangle(xy=(171.2, 0), width=3.9, height=29, angle=0)
Rectangle(xy=(175.1, 0), width=3.9, height=35, angle=0)'''
plt.rcParams['font.sans-serif']=["SimHei"]
plt.title('数据统计')
plt.xlabel('身高')
plt.ylabel('比率')
plt.show()
五、饼状图
显示一个数据系列中各项目的占项目总和的百分比
plt.pie(x,explode=None,labels=None,colors=None,autopct=None)
值 | 含义 |
---|---|
x | x:数组序列,数组元素对应扇形区域的数量大小 |
labels | 列表字符串序列,为每个扇形区域备注一个标签名字 |
colors | 为每个扇形区域设置颜色,默认按照颇色周期自动设置。 |
autopct | 格式化字符串"mt%pc!",使用百分比的格式设置每个扇形区的标签,并将其放置在扇形区内 |
pctdistance | 设管百分比标签与圆心的距离; |
labeldistance | 设置各扇形标签(图例)与圆心的距离; |
explode | 指定饼图某些部分的突出显示,即呈现炸式 |
shadow | 是否添加饼图的阴影 |
from matplotlib import pyplot as plt
plt.rcParams['font.sans-serif']=["SimHei"]
#定义饼的标签
labels=['娱乐','育儿','饮食','房贷','交通','其它']
#每个标签的数量
x=[200,500,1200,700,200,900]
plt.title('饼状图')
#数据,标签,每个区域的颜色,显示百分比
plt.pie(x,labels=labels,colors=['red','blue','yellow','green','gray'],autopct='%.2f%%')
plt.show()
饼状图的分离
explode:指定突出部分
from matplotlib import pyplot as plt
plt.rcParams['font.sans-serif']=["SimHei"]
labels=['娱乐','育儿','饮食','房贷','交通','其它']
x=[200,500,1200,700,200,900]
plt.title('饼状图')
#设置每一块距离圆心的位置,值是百分比
explode=[0.03,0.05,0.06,0,0.08,0.1]
plt.pie(x,labels=labels,colors=['red','blue','yellow','green','gray'],autopct='%.2f%%',explode=explode)
plt.show()
设置饼状图百分比和文本距离中心位置
pctdistance:设管百分比标签与圆心的距离;
labeldistance:设置各扇形标签(图例)与圆心的距离
from matplotlib import pyplot as plt
plt.rcParams['font.sans-serif']=["SimHei"]
#定义饼的标签
labels=['娱乐','育儿','饮食','房贷','交通','其它']
#每个标签的数量
x=[200,500,1200,700,200,900]
plt.title('饼状图')
explode=[0.03,0.05,0.06,0,0.08,0.1]
colors=['red','blue','yellow','green','gray']
#设置标签到圆心的距离,百分比到圆心的距离
plt.pie(x,labels=labels,colors=colors,autopct='%.2f%%',explode=explode,labeldistance=1.3,pctdistance=1.2)
plt.show()
六、散点图
数据以点的形式展现在坐标系
可以推断出变量的相关性
plt.scatter(x,y)
值 | 含义 |
---|---|
x,y | 散点的坐标 |
s | 散点的面积 |
c | 散点的颜色(默认信为蓝色,"b’,其余颜色同plt.plot( )) |
marker | 散点样式(默认估为实心圆,o’,其余样式同plt.plot()) |
alpha | 散点透明度([0,1]之间的数,0表示完全透明,1则表示完全不透明) |
linewidths | 散点的边缘线宽 |
edgecolors | 散点的边缘颜色 |
cmap | Colomap,默认 None,标量或者是一个 colormap 的名字,只有c是一个浮点数数组的时才使用 |
from matplotlib import pyplot as plt
import numpy as np
x=np.array([1,2,3,4,5,6,7,8])
y=np.array([1,4,9,16,7,11,23,18])
s=np.random.rand(8)*20
colors=np.random.rand(8)
#指定点的大小,颜色
plt.scatter(x,y,s=s,c=colors)
plt.show()
from matplotlib import pyplot as plt
import numpy as np
x=np.random.rand(100)
y=np.random.rand(100)
colors=np.arange(1,101)
#指定点的大小,颜色
plt.scatter(x,y,c=colors,cmap='Blues')
plt.show()