python做可视化图表

一、Matplotlib基本介绍 Matplotlib(mathematic plot lib,数学绘图库) 是一个可视化绘图库 。可以使用这个库轻松地完成线形图、直方图、条形图、误差图或散点图 等操作,设置标签、图例、调整绘图大小 等。是python中使用最广的绘图库。有很多库(如pandas,

一、Matplotlib基本介绍

Matplotlib(mathematic plot lib,数学绘图库)是一个可视化绘图库。可以使用这个库轻松地完成线形图、直方图、条形图、误差图或散点图等操作,设置标签、图例、调整绘图大小等。是python中使用最广的绘图库。有很多库(如pandas,seaborn)的绘图功能都是基于matplotlib实现的。

pyplot(python plot,python绘图)是Matplotlib的一个基于状态的接口,可以快速的绘制图表,通常我们绘图只需要通过pyplot的接口就可以了。

在Jupyter notebook中进行交互式绘图,需要执行一下语句:

%matplotlib notebook

使用matplotlib时,使用的导入的语句

import matplotlib.pyplot as plt
from matplotlib import pyplot as plt

二、两种绘图方式区别(plt.*** 和ax.***)

利用matplotlib画图有两种方式,一个直接调用pyplot模型中的相应函数就可以完成绘图,称为过程式绘图;另一种可以在画布上显示多个图表,称为面向对象绘图,fig.subplots()无参数创建图表,默认创建一个图表。

先matplotlib架构上理解,可以理解为:

matplotlib架构上分为三层  

底层:backend layer

中层:artist layer  

最高层:scripting layer

在任意一层操作都能够实现画图的目的,而且画出来还都一样。但越底层的操作越细节话,越高层越易于人机交互。

plt. 对应的就是最高层 scripting layer。这就是为什么它简单上手,但要调细节就不灵了。

ax.plot 是在 artist layer 上操作。基本上可以实现任何细节的调试。

三、如何使用Matplotlib绘图

快速绘图的流程:从左往右

1、画布—绘画的画板

函数接口函数作用参数说明
plt.figure()创建一个新的绘图窗口,设置画布大小。figsize:参数格式为(width,height),单位为inch。dpi参数:分辨率,指每inch像素数。默认dpi为100。例figsize=(18,6)
fig.add_subplot(row,col,index)在新的绘图窗口上创建子图,子图相互独立无显式参数,逗号可以省略,fig.add_subplot(2,2,2)与fig.add_subplot(222)都可以。 row:行,col:列,index:子图的位置
plt.show()显示当前figure图像
plt.close()关闭当前figure窗口

过程式绘图

import matplotlib.pyplot as plt
import numpy as np

x = np.random.random(10)
y = np.random.random(10)
plt.plot(x,y)	#绘制拆线图
plt.show()		#显示图形

说明:依次调用pyplot模块中的相应函数就可以完成绘图。

面向对象绘图

import matplotlib.pyplot as plt
fig=plt.figure(figsize=(18,6))
ax1=fig.add_subplot(2,2,1) # 创建2*2=4张图,ax1画在第一张图上
ax2=fig.add_subplot(2,2,2) # 创建2*2=4张图,ax2画在第二张图上
ax3=fig.add_subplot(2,2,3) # 创建2*2=4张图,ax3画在第三张图上
ax4=fig.add_subplot(2,2,4) # 创建2*2=4张图,ax4画在第四张图上
plt.show()  # 显示画布
plt.close() # 关闭画布

说明:

1、先通过plt.figure()函数创建一张完整的画面,作为底层,之后的所有操作都在这张画布上完成。

2、再通过figure.add_subplot()函数创建子图,相当于在已创建的画布上再叠加子图,子画布间相互独立,这样就可以达到一次性完成多幅图片的效果。

3、创建多个子图,可通过循环最后一个参数达到效果。

fig=plt.figure(figsize=(18,6))

for i in range(1,5):
	ax=fig.add_subplot(2,2,i)

plt.show()
plt.close()

4、在一张画布上创建子图的其他方法

#方法1
fig=plt.figure()
ax=fig.add_axes([left, bottom, width, height])

#方法2
fig,ax=plt.subplots(行数, 列数)

2、配置—更个性化的绘图

全局配置

过程式和面向对象式配图都适用

指定中文字体

函数接口函数作用参数说明
matplotlib.font_manager.FontProperties()指定中文字体font_path:指定字体的路径。

# 指定中文字体样式、大小
import matplotlib.font_manager as mfm
# 请换成自己电脑的字体路径
font_path = r"c:\windows\Fonts\simsun.ttc"
prop = mfm.FontProperties(fname = font_path)

fig = plt.figure() 
ax1 = fig.add_subplot(111)
ax1.set_title('你好',fontproperties=prop,fontsize=20)
plt.show()

指定全局画图主题

函数接口函数作用参数说明
plt.style.use()指定画图主题无显式参数,style_name:设置主题名

常用主题:’ggplot’、‘seaborn-bright’、‘seaborn-white’、‘seaborn-darkgrid’、‘season-deep’

# 查看所有主题
plt.style.available 

# 指定全局画图主题为ggplot
plt.style.use('ggplot')

局部配置

面向对象绘图过程:ax代表子图变量

图表标题设置

函数接口函数作用参数说明
ax.set_title()在当前图形中添加主题,可以指定标题的名称、位置、颜色、字体大小等参数。label:标题文字,fontsize:指定字体大小,color:指定字体颜色,loc可选值为{‘left’,‘center’,‘right’},默认值为’center’

ax.set_title(“sample”):设置图表标题。
ax.set_title(“title”, loc=‘left’):设置图表标题位置。

坐标轴设置

函数接口函数作用参数说明
ax.set_xlabel()当前图形中添加x轴名称,可以指定标题的名称、位置、颜色、字体大小等参数。xlabel:标签文字,fontsize:指定字体大小
ax.set_ylabel()当前图形中添加y轴名称,可以指定标题的名称、位置、颜色、字体大小等参数。ylabel:标签文字,fontsize:指定字体大小
ax.set_xlim()设置当前图形中x轴的范围,只能确定一个数值区间,而无法使用字符串标识。left:指定最小值,right:指定最大值,可以使用tuple合并表示(left,right)
ax.set_ylim()设置当前图形中y轴的范围,只能确定一个数值区间,而无法使用字符串标识。bottom:指定最小值,top:指定最大值,可以使用tuple合并表示(bottom,top)
ax.set_xticks()指定x轴刻度的数目与取值。ticks:传入列表,每个元素代表一个刻度值。
ax.set_yticks()指定y轴刻度的数目与取值。ticks:传入列表,每个元素代表一个刻度值。
ax.set_xticklabels()设置x轴刻度的显示值。labels:每个刻度上显示的值,fontsize:指定字体大小
ax.set_yticklabels()设置y轴刻度的显示值。labels:每个刻度上显示的值,fontsize:指定字体大小
ax.hlines()设置水平线y:某个纵坐标,固定值。xmin:横坐标最小值。xmax:横坐标最大值。
ax.vlines()设置垂直线x:某个纵坐标,固定值。ymin:横坐标最小值。ymax:横坐标最大值。
ax2=ax1.twinx()子图ax1、ax2共享x轴
ax2=ax1.twiny()子图ax1、ax2共享y轴

设置坐标轴标签文本
ax.set_xlabel(‘X axis’)
ax.set_ylabel(‘Y axis’)

设置x,y轴坐标刻度显示范围
ax.set_xlim(-3.5,3.5)
ax.set_ylim(-1.5,1.5)

设置主刻度坐标
ax.set_xticks([-4,-2,0,2,4])
ax.set_yticks([-1,-0.5,0,0.5,1])
设置次刻度坐标
ax.set_xticks(np.arange(-4,4,0.5),minor=True)
ax.set_yticks(np.arange(-1.5,1.5,0.1),minor=True)

图例

函数接口函数作用参数说明
ax.legend指定当前图形的图例,可以指定图例大小、位置、标签。labels:标签名。loc:图例的位置。bbox_to_anchor:指定图例的位置(横坐标,纵坐标)(横纵最大1.0,最小0.0)。prop:等同于fontproperties。fontsize:字体大小。

ax.legend(loc=‘upper right’):自定义图例位置。

loc 可选择的参数

  • ‘best’:自动选择最佳位置
  • ‘upper left’:左上角
  • ’upper right’:右上角
  • ‘lower left’:左下角
  • ‘lower right’:右下角
  • ‘center left’:中左
  • ‘center right’:中右
  • ‘lower center’:中下
  • ‘upper center’:中上

ax.legend(fontsize=‘samll’) 自定义图例文字大小。
ax.legend(fontsize=10)

fontsize 可选择的参数

  • 相对大小(字符串)
    ‘xx-small’,‘x-small’,‘smal’:小于当前默认字体大小
    ‘medium’:中等
    ‘large’,‘x-large’,‘xx-large’:大于当前默认字体大小
  • 绝对大小(数值)
    fontsize=10:绝对字体大小,单位为点。

ax.legend(labelcolor=[‘r’,‘b’]):设置图例文本颜色。
ax.legend(mode=‘expand’):图例水平平铺。

保存图形

函数接口函数作用参数说明
plt.savefig()保存图片fname:文件名;dpi:像素,单个数值即可。

plt.savefig(“sample.png”)

支持如下格式:

jpg, jpeg:jpg图

png:png图

svg, svgz:svg图

tif, tiff:tiff图

pgf:pgf位图

pdf, eps, ps:pdf或postscript文件

raw, rgba

面向对象画图的代码示例

#准备数据
import numpy as np
x=np.linspace(-np.pi,np.pi,100)
y=np.sin(x)

#导入matplotlib库pyplot模块
import matplotlib.pyplot as plt

#创建画布
fig=plt.figure()

#创建图表
ax=fig.subplots()

#绘制折线图,设置点线样式,设置线条名称
ax.plot(x,y,'+r--', label='line1',mec='b',ms=10)  #点为蓝色+(大小为10),线为红色虚线

#设置坐标轴
ax.set_xlabel('X axis')            #坐标轴文本标签
ax.set_ylabel('Y axis')
ax.set_xticks([-4,-2,0,2,4])       #主刻度
ax.set_xticks(np.arange(-4,4,0.5),minor=True)  #次刻度
ax.set_yticks([-1,-0.5,0,0.5,1])
ax.set_yticks(np.arange(-1.5,1.5,0.1),minor=True)
ax.tick_params(axis='y',labelrotation=30)      #y轴主刻度文字旋转30度
ax.set_xlim(-3.5,3.5)              #设置显示刻度范围
ax.set_ylim(-1.5,1.5)

ax.grid(True)                      #显示主刻度网格

#设置图例
ax.legend()                  #注意需要绘图时,需指定label参数

#设置标题
ax.set_title("sample")

#保存显示图形
fig.savefig("sample.png")
plt.show()

过程式绘图过程

图表标题设置

函数接口函数作用
plt.title()在当前图形中添加主题,可以指定标题的名称、位置、颜色、字体大小等参数。

坐标轴设置

函数接口函数作用
plt.xlabel()在当前图形中添加x轴名称,可以指定标题的名称、位置、颜色、字体大小等参数。
plt.ylabel()当前图形中添加y轴名称,可以指定标题的名称、位置、颜色、字体大小等参数。
plt.xlim()指定当前图形中x轴的范围,只能确定一个数值区间,而无法使用字符串标识。
plt.ylim()指定当前图形中y轴的范围,只能确定一个数值区间,而无法使用字符串标识。
plt.xticks()指定x轴刻度的数目与取值。
plt.yticks()指定y轴刻度的数目与取值。

图例

函数接口函数作用
plt.legend()指定当前图形的图例,可以指定图例大小、位置、标签。

说明:方法参数基本上与面向对象方式一致。只是调用属性有区别。

过程式画图的代码示例:

#准备数据
import numpy as np
x=np.linspace(-np.pi,np.pi,100)
y=np.sin(x)

#导入matplotlib库pyplot模块
import matplotlib.pyplot as plt

#绘制折线图,设置点线样式,设置线条名称
plt.plot(x,y,'+r-.', label='line1')   #点为蓝色+,线为红色点划线

#设置坐标轴
plt.xlabel('X axis')                  #坐标轴文本标签
plt.ylabel('Y axis')
plt.xticks([-4,-2,0,2,4])             #主刻度,不支持次刻度设置
plt.yticks([-1,-0.5,0,0.5,1], rotation=30)
plt.xlim(-3.5,3.5)                    #设置显示刻度范围
plt.ylim(-1.5,1.5)

plt.grid(True,c='gray',linestyle=':') #显示主刻度网格

#设置图例
plt.legend()                          #注意需要绘图时,指定label参数

#设置标题
plt.title("sample")

#保存显示图形
plt.savefig("sample.png")

plt.show()

四、常用绘图图形

如何选择常用绘图图形?

散点图

散点图(scatter diagram,scatter:分散;撒;四散;散开;驱散;撒播)又称为散点分布图,是以一个特征为横坐标,另一个特征为纵坐标,值是由点在图表中的位置表示,类别是由图表中的不同标记表示,通常用于比较跨类别的数据。

散点图主要功能利用坐标点(散点)的分布形态反映特征间的统计关系(相关性)的一种图形。

1)线性相关:x,y变量的散点看上去都在一条直线附近波动;

2)非线性相关:x,y变量的散点都在某条曲线(非直线)附近波动;

3)不相关:所有点在图中没有显示任何关系

scatter()函数

函数接口函数作用
matplotlib.pyplot.scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, verts=None, edgecolors=None, hold=None, data=None, **kwargs)绘制散点图

基本参数说明:

参数名称说明
x,yx:自变量。y:因变量。
s指定点的大小,数值或者一维的array,若传入一维array则表示每个点的大小。默认为None。
c指定点的颜色,浮点数、颜色或者颜色列表,若传入一维array则表示每个点的颜色,默认为None。
marker表示绘制点的类型,待定string,默认为小圆圈‘o’。
cmapColormap,默认为None,标量或者是一个colormap的名字,只有c是一个浮点数数组的时才使用,如果没有申明就是image.cmap。
normNormalize,默认为None,数据亮度在0-1之间,只有c是一个浮点数的数组时才使用。
vmin,vmax亮度设置,在norm参数存在时忽略。
alpha表示点的透明度,0-1的小数,默认为None,即不透明。
linewidths散点的边缘线宽。
edgecolors散点的边缘颜色,默认为 ‘face’,可选值有 ‘face’, ‘none’。
**kwargs其他参数。

举例1:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.font_manager as mfm
fig,ax=plt.subplots() #创建画布与图表
plt.rcParams['font.family']=['SimHei'] #用来显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号

#准备数据
x1=np.arange(1,30)
y1=np.sin(x1)

ax=plt.subplot(1,1,1)
plt.title('散点图')
plt.xlabel('X')
plt.ylabel('Y')
lvalue=x1
#绘制散点图。颜色为'r',点的大小为s,散点的边缘线宽为linewidths,点的类型为marker。
ax.scatter(x1,y1,c='r',s=100,linewidths=lvalue,marker='o')
plt.legend('x1')
plt.show()

在这里插入图片描述

举例2:

import numpy as np
import matplotlib.pyplot as plt

fig,ax=plt.subplots()
plt.rcParams['font.family']=['SimHei']  #用来显示中文标签
plt.rcParams['axes.unicode_minus']=False  #用来正常显示负号

#绘制散点图。颜色为['red','green','blue'],透明度为0.3,散点的边缘颜色为'none'。
for color in ['red','green','blue']:
	n=500
	x,y=np.random.randn(2,n)
	ax.scatter(x,y,c=color,label=color,alpha=0.3,edgecolors='none')
	ax.legend()
	ax.grid(True)

plt.show()

举例3:

比较特别的,用浮点数表示颜色,表示从当前matplotlib.colors.Colormap映射得到的颜色,相当于多个调色盘的合集。并非所有颜色参数都可以浮点数表示(比如plot就不行)。

import numpy as np
import matplotlib.pyplot as plt

fig,ax=plt.subplots() #创建画布与图表
#准备数据
x=np.random.randn(50)*10 #随机产生50个x轴坐标
y=np.random.randn(50)*10 #随机产生50个y轴坐标
sizes=(np.random.randn(50)*10)**2 #随机产生50个用于改变散点面积的数值
colors=np.random.randn(50)*10

#绘制散点图。颜色为colors,大小为sizes(单位points^2),透明度为0.5
ax.scatter(x,y,s=sizes,c=colors,alpha=0.5)

plt.show()

折线图

折线图(line chart)是一种将数据点按照顺序连接起来的图形。可以看作是将散点图,按照x轴坐标顺序连接起来的图形。可以只显示点、只显示线,或者点、线都显示。

折线图的主要功能观察因变量y随着自变量x改变的趋势

  • 最适合用于显示随时间(根据常用比例设置)而变化的连续数据
  • 适合用于观察数量的差异,增长趋势的变化。

plot()函数

函数接口函数作用
matplotlib.pyplot.plot(*args, **kwargs)绘制折线图

基本参数说明:

参数名称说明
x,yx:自变量。y:因变量。
marker绘制的点的样式,接受特定string,默认为None,例如marker=‘o’。
markersize绘制点的大小,ms=1.5。
linestyle线条样式,接受特定string,默认为’-'。
linewidth线条宽度
color线条颜色,接受特定string,默认为None。‘b’:蓝色,‘g’:绿色,’r’:红色,‘c’:青色,’m’:品红,‘y’:黄色,’k’:黑色,’w’:白色。
markerfacecolor点填充颜色。例如mfc=‘r’。
markeredgecolor点边缘颜色。例如meg=‘g’。
markeredgewidth点边缘宽度。例如mew=0.5。
alpha表示点的透明度,0-1的小数,默认为None。
fmt = ‘[marker][line][color]’fmt为字符串由点样式、颜色、线样式组成,例如’+r–':点样式为+,颜色为红色,线样式为虚线

举例1:

import numpy as np 
import matplotlib.pyplot as plt 
fig,ax=plt.subplots() #创建画布与图表

#准备数据
x=np.linspace(0,4*np.pi,50)  #通过定义均匀间隔创建数值序列
y1=np.sin(x)
y2=np.cos(x)
y3=np.cos(x+np.pi)

#绘制'line1'。线条为灰色,线形为点划线('-.'),线宽为1。
ax.plot(x,y1,c='gray',linestyle='-.',linewidth=1,label='line1')

#绘制'line2'。线条为红色,线型为虚线('--')
ax.plot(x,y2,'r--',label='line2')

#绘制'line3'。同时显示点和线。
#点大小为10,填充颜色为绿色,边缘颜色为红色,边缘宽度为1。
#线为蓝色实绩,线条宽度为2。
ax.plot(x,y3,'ob-',mfc='g',mec='r',ms=10,linewidth=2,label='line3')

ax.legend(loc='upper right') #设置图例
plt.show()

箱线图

箱线图(boxplot)也称箱须图,其绘制需使用数据中的五个常用统计量(最小值、下四分位数、中位数、上四分位数和最大值)来描述数据。

箱线图主要功能是能提供有关数据的位置和分散情况等相关信息,可以粗略地看出数据是否具有对称性、分布的分散程度等。

适用于比较几个样本,观察其不同特征。

boxplot()函数

函数接口函数作用
matplotlib.pyplot.boxplot(x, notch=None, sym=None, vert=None, whis=None, positions=None, widths=None, patch_artist=None,meanline=None, labels=None, … )绘制箱线图

基本参数说明:

参数名称说明
x表示用于绘制箱线图的数据,接受array,无默认。
notch表示中间简体是否有缺口,默认为None,接boolean。
sym指定异常点(超出Q0-Q5范围的值的绘制颜色和符号,默认为None,接收特定string。
vert表示图形是纵向或者横向,默认为None。
positions表示图形位置,接叫array,默认为None。
widths接收scalar或者array,表示每个箱体的宽度,默认为None。
labels指定每一个箱线图的标签,默认为None。
meanline表示是否显示均值线,接叫boolean,默认为False。
showfliersFalse:不显示超出Q0-Q5范围的点,True:显示超出Q0-Q5范围的点。
whis=1.5Q0=Q1-whis*(Q3-Q1),Q5=Q3+whis*(Q3-Q1)

举例1:

import numpy as np 
import matplotlib.pyplot as plt
import pandas as pd 
fig,ax=plt.subplots()

#准备数据
np.random.seed(2)
df=pd.DataFrame(np.random.rand(5,4),columns=['A','B','C','D'])

#df.boxplot()
ax.boxplot(df,sym='r+',whis=1.25)
plt.show()

在这里插入图片描述

柱状图

柱状图一般用横轴表示数据所属类别,纵轴表示数量或者占比

柱状图主要功能是观察数据模式、样本的频率分布和总体的分布

  • 适用于比较产品质量特性的分布状态,判断其总体质量分布情况。
  • 适用于属于不同组别的统计,可以用于比较组别的数据差异。

与直方图区别:

1)直方图展示数据的分布,柱状图比较数据的大小

2)直方图X轴为定量数据(数据区间),柱状图X轴为分类数据

3)直方图柱子无间隔(区间是连续的),柱状图柱子有间隔

4)直方图柱子宽度可不一,柱状图柱子宽度须一致

bar()函数

函数接口函数作用
matplotlib.pyplot.bar(x,left,height,width = 0.8,bottom = None,hold = None,data = None,** kwargs )绘制柱状图

bar()函数绘制垂直柱状图,barh()函数绘制水平柱状图。

基本参数说明:

参数名称说明
xbar坐标刻度参数。也是默认的坐标刻度文本。barh为y参数。
left每根柱子最左边的刻度,接受list。
height每根柱子的高度,即y轴上的坐标。浮点数或类数组结构。
width柱子的宽度,接收0-1之间的float,如0.5。
bottom柱子最低处的高度,浮点数或类数组结构。如0.5。
color柱子的颜色,颜色值或颜色值序列。如‘red’。
edgecolor柱形图边缘颜色,颜色值或颜色值序列。
linewidth柱形图边缘宽度,浮点数或类数组。如果为0,不绘制柱子边缘。
tick_label坐标刻度文本,字符串或字符串列表。不再使用x,y作为柱标签。

举例1:

单个柱状图代码示例

import numpy as np 
import matplotlib.pyplot as plt
fig,ax=plt.subplots()

#准备数据
x=np.arange(6)
y=np.random.uniform(0,10,6)

ax.bar(x,y) #绘制简单柱状图。用x坐标文本标签
ax.bar(x,y,tick_label=list('abcdef'),color='gray',lw=1,ec='orange') #制定文本作为标签,填充灰色,描边宽度为1,颜色为橙色

plt.show()

在这里插入图片描述

举例2:

设置柱形图宽度,bar() 方法使用 width 设置,barh() 方法使用 height 设置 height
垂直柱状图与水平柱状图代码示例(两种作图方式):

import numpy as np 
import matplotlib.pyplot as plt
fig,axes=plt.subplots(2,1)
data=pd.Series(np.random.randn(16),index=list('abcdefghijklmnop'))
data.plot.bar(ax=axes[0],color='gray',alpha=0.7) #绘制垂直柱状图
data.plot.barh(ax=axes[1],color='gray',alpha=0.7) #绘制水平柱状图

在这里插入图片描述

import numpy as np
import matplotlib.pyplot as plt 
fig=plt.figure(figsize=(18,6))
ax1=fig.add_subplot(211)
ax2=fig.add_subplot(212)
x1=list('abcdefghijklmnop')
y1=np.random.randn(16)

ax1.bar(x1,y1,color='gray',alpha=0.7,width=0.5,) 
ax2.barh(x1,y1,color='gray',alpha=0.7,height=0.5)

在这里插入图片描述

举例3:

分组柱形图代码示例:

import numpy as np
import matplotlib.pyplot as plt
fig,ax=plt.subplots(figsize=(7,5))
plt.rcParams['font.family']=['SimHei']#用来显示中文标签
plt.rcParams['axes.unicode_minus']=False  #用来正常显示负号

x=np.arange(1,6)
Y1=np.random.uniform(1.5,1.0,5)
Y2=np.random.uniform(1.5,1.0,5)
ax.bar(x,Y1,width=0.35,facecolor='lightskyblue',edgecolor='white',label='A')
ax.bar(x+0.35,Y2,width=0.35,facecolor='yellowgreen',edgecolor='white',label='B') 
ax.legend()
plt.show()

在这里插入图片描述

举例4:

分组柱形图(进阶)代码示例:

import matplotlib
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.patches as mpatches

matplotlib.rcParams['font.sans-serif']=['SimHei']
matplotlib.rcParams['axes.unicode_minus']=False

plt.rcParams['xtick.direction'] = 'in'
plt.rcParams['ytick.direction'] = 'in'

fig,ax=plt.subplots(figsize=(20, 8),dpi=80)

year = ['2015年','2016年','2017年']
data1 = [68826, 73125, 77198]
data2 = [50391, 54455, 57892]

# 先得到year长度, 再得到下标组成列表
x = range(len(year))
ax.bar(x,data1,width=0.2,color='#FF6347')

# 向右移动0.2,柱状条宽度为0.2
ax.bar([i + 0.2 for i in x],data2,width=0.2,color='#008B8B')

# 底部汉字移动到两个柱状条中间(本来汉字是在左边蓝色柱状条下面, 向右移动0.1)
ax.set_xticks([i+0.1 for i in x])
ax.set_xticklabels(year, fontsize=15)
ax.set_ylabel('人数(万人)',size=13)


color = ['#FF6347', '#008B8B']
labels = ['中国网民规模', '中国网络视频用户规模']

patches = [mpatches.Patch(color=color[i], label="{:s}".format(labels[i]) ) for i in range(len(color))]

ax=plt.gca()
box = ax.get_position()
ax.set_position([box.x0, box.y0, box.width , box.height* 0.8])
#下面一行中bbox_to_anchor指定了legend的位置
ax.legend(handles=patches, bbox_to_anchor=(0.65,1.12), ncol=3) #生成legend

# 为每个条形图添加数值标签
for x1,y1 in enumerate(data1):
    ax.text(x1, y1+200, y1,ha='center',fontsize=16)
for x2,y2 in enumerate(data2):
    ax.text(x2+0.2,y2+200,y2,ha='center',fontsize=16)
    
plt.show()

在这里插入图片描述

饼图

饼图(Pie Graph)是将各项的大小与各项总和的比例显示在一张“饼”中,以“饼”的大小来确定每一项的占比。

饼图主要功能是反映出部分与部分、部分与整体之间的比例关系。

适用于要求直观地展示每组数据相对于总数的大小。

pie()函数

函数接口函数作用
matplotlib.pyplot.pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=0, radius=1, counterclock=True, wedgeprops=None, textprops=None, center=0, 0, frame=False, rotatelabels=False, *, normalize=None, data=None)[source]绘制饼图

基本参数说明:

参数名称说明
x每一块饼的数值,浮点型数组或列表。
explode每块饼突出来的距离,数组。如 explode=[0,0.2,0,0]:第i个数字表示第i个饼炸开距离(数值×半径=距离),explode参数的长度必须和x参数相同。
labels指定第一个饼图的文本标签,列表,默认为None。
colors每块饼的颜色,数组,默认为None。
autopct指定数值的显示方式,设置小数点,默认为None,%d%% 整数百分比,%0.1f 一位小数, %0.1f%% 一位小数百分比, %0.2f%% 两位小数百分。
labeldistance标签标记的绘制位置,相对于半径的比例,默认为1.1,如<1则绘制在饼图内侧,float。
pctdistance类似于 labeldistance,指定 autopct 的位置刻度,默认值为 0.6。
shadow布尔值 True 或 False,是否有阴影,默认为 False,不设置阴影。
radius设置饼图的半径,默认为1。
startangle指定饼图的起始角度,默认从x轴正方向逆时针画起,如设定=90则从y轴正方向画起。
counterclock布尔值,用于指定是否逆时针绘制扇形,默认True,即逆时针绘制,False为顺时针。
wedgeprops字典类型,默认值 None。用于指定扇形的属性,比如边框线颜色、边框线宽度等,如
textporps字典类型, 用于指定文本标签的属性,比如字体大小、字体颜色等,默认值为None。
center浮点类型的列表,用于指定饼图的中心位置,默认值:(0,0)
frame布尔类型,用于指定是否绘制饼图的边框,默认值:False。如果是True,绘制带有表的轴框架。
rotatelabels布尔类型,指定是否旋转文本标签,默认为False。如果为True,旋转每个label到指定的角度。
data用于指定数据。如果设置了 data 参数,则可以直接使用数据框中的列作为 x、labels 等参数的值,无需再次传递。

举例1:

import numpy as np 
import matplotlib.pyplot as plt
fig,ax=plt.subplots()

#准备数据
labels='Spring','Summer','Autumn','Winter'
x=[15,30,45,60]

ax.pie(x
		,labels=labels #设置标签
		,explode=[0,0,0.1,0] #第3个饼图炸开
		,wedgeprops={'lw':2,'ec':'lightblue'} #描边
		,startangle=60 #起始角度,默认从0开始逆时针转
		,autopct='%1.1f%%' #在图中显示比例值,注意值的格式。
		)
		
ax.set_title('Rany days by season')
plt.show()

在这里插入图片描述

直方图

直方图(Histogram)又称质量分布图,是统计报告图的一种,表示同一组数据在连续间隔或者特定时间段内容的分布情况,横轴表示数据类型(同一个变量的分组统计),纵轴表示一组数据分布情况,每个数据宽度可以任意变化。

直方图主要功能是描述一组数据的频次分布,有助于观察众数、中位数的位置,关注数据存在缺口或者异常值。

hist()函数

函数接口函数作用
matplotlib.pyplot.hist(x, bins=None, range=None, density=False, weights=None, cumulative=False, bottom=None, histtype=‘bar’, align=‘mid’, orientation=‘vertical’, rwidth=None, log=False, color=None, label=None, stacked=False, **kwargs)绘制直方图

基本参数说明:

参数名称说明
x表示要绘制直方图的数据,可以是一个二元组或列表。
bins表示直方图的箱数,默认为10。
range表示要直方图的值域范围,可以是一个一维数组或列表。默认为None,即使用数据中的最小值和最大值。
density表示是否将直方图归一化,默认为False,即直方图的高度为每个箱子内的样本数,而不是频率或概率密度。
weights表示每个数据点的权重,默认为None。
cumulative表示是否绘制累积分布图,默认为False。
bottom表示直方图的起始高度,默认为None。
histtype表示直方图类型,可以是’bar’、’barstacked’、‘step’、‘stepfilled’等。默认为’bar’。
align表示直方图箱子的对齐方式,可以是’left’、‘mid’、‘right’。默认为’mid’。
orientation表示直方图的方向,可以是’vertical’、‘horizontal’。默认为’vertical’。
rwidth表示每个箱子的宽度。默认为None。
log表示是否在y轴上使用对数刻度。默认为False。
color表示直方图的颜色。
label表示直方图的标签。
stacked表示是否堆叠不同的直方图。默认为False。
**kwargs表示其他绘图参数。

举例1:

import numpy as np
import matplotlib.pyplot as plt 
fig,ax=plt.subplots()

# 使用 NumPy 生成随机数
x= np.random.normal(170, 10, 250)
ax.hist(x,bins=30,color='r',cumulative=True)
ax.set_xlabel('random test')

plt.show()
plt.close()

在这里插入图片描述

五、绘图数据和多子图绘图

列表绘图

import numpy as np 
import matplotlib.pyplot as plt

x=[1,2,3,4]
y=[1,4,9,16]

plt.plot(x,y)

plt.show()

数组绘图

import numpy as np 
import matplotlib.pyplot as plt

t=np.arange(0,5,0.2)

#线条1
x1=y1=t

#线条2
x2=x1
y2=t**2
#线条3
x3=x1
y3=t**3

#使用plot绘制线条
lineslist=plt.plot(x1,y1,x2,y2,x3,y3)

#使用setp方法可以同时设置多个线条的属性
plt.setp(lineslist,color='r')
plt.show()

print('',type(lineslist))
print('',len(lineslist))

字典绘图

import numpy as np 
import matplotlib.pyplot as plt

data={'x':np.arange(50),
	  'y':np.random.randint(0,50,50),
	  'color':np.random.randn(50)}

plt.scatter('x','y',c='color',data=data)

plt.show()

多子图绘制

可以用如下三个方法创建多个子图

  • fig,axes=plt.subplots(m,n):一次生成m行n列子图。
  • axes=fig.subplots(m,n):一次生成m行n列子图,返回m*n个axes对象。
  • fig.add_subplot((m,n,i)):增加一个子图,m行n列放在第i个。建议采用这个方法创建多子图。
    • 也可以fig.add_subplots(mni)方式调用。

举例1:

fig,axes=plt.subplots(m,n):一次生成m行n列子图。

import numpy as np
import matplotlib.pyplot as plt 

ax=plt.subplots(2,2)
ax1=ax[0]
ax2=ax[1]
ax3=ax[2]
ax4=ax[3]

ax1.plot(x,y)

举例2:

fig.add_subplot((m,n,i)):增加一个子图,m行n列放在第i个。建议采用这个方法创建多子图。

import numpy as np
import matplotlib.pyplot as plt 

#准备数据
x=np.linspace(-np.pi,np.pi,100)
y=np.sin(x)

fig=plt.figure()
ax1=fig.add_subplot(2,2,1)
ax1.plot(x,y,'r-')
ax2=fig.add_subplot(2,2,3)
ax2.plot(x,y,'b:')
ax3=fig.add_subplot(1,2,2)
ax3.plot(x,y,'Dg--')

plt.show()

在这里插入图片描述

画布级别标题和标签

  • fig.suptitle(“figtitle”):设置总标题(与所有子图平级)
  • fig.supxlabel(“figxlabel”):设置总x标签(如果所有子图标签相同,可以只设置一个总标签)
  • fig.supylabel(“figxlabel”):设置总y标签

子图间距

  • fig.subplots_adjust(wspace=0.5,hspace=0.5):调整子图之间的间距
    • wspace:表示子图间宽度方向间隔系数
    • hspace:表示子图间高度方向间隔系数
  • fig.tight_layout(pad=1):调整子图四周空白宽度
    • pad:四周空白宽度系数
    • w_pad:宽度方向空白宽度系数
    • h_pad:高度方向空白宽度系数

import numpy as np
import matplotlib.pyplot as plt 

#准备数据
x=np.linspace(-np.pi,np.pi,100)
y=np.sin(x)

fig=plt.figure()

#画布设置
fig.suptitle("figtitle", x=0.5, y=0.98)
fig.supxlabel("figxlabel", x=0.5, y=0.02)
fig.supylabel("figylabel", x=0.02, y=0.5)
fig.subplots_adjust(wspace=0.5,hspace=0.5)
fig.tight_layout(pad=2)

ax1=fig.add_subplot(2,2,1)
ax1.plot(x,y,'r-')
ax2=fig.add_subplot(2,2,3)
ax2.plot(x,y,'b:')
ax3=fig.add_subplot(1,2,2)
ax3.plot(x,y,'Dg--')

plt.show()

在这里插入图片描述

参考文章:
Matplotlib系列(一):快速绘图入门_matplotlib思维导图-CSDN博客
python利用matplotlib进行可视化_import numpy as np data = np.arange(10) data plt.p-CSDN博客
【python绘图】Matplotlib绘图及设置(使用python制图)_python画图设置-CSDN博客
​Matplotlib入门-6-plt.bar( )绘制柱状图 - 知乎

转自:python可视化模块—快速利用matplot绘制图表-CSDN博客

知秋君
上一篇 2024-08-15 17:36
下一篇 2024-08-15 17:02

相关推荐