Matplotlib库-Python数据可视化

Matplotlib基础

Matplotlib库介绍

  1. Matplotlib是Python的绘图库,是和交互式的进行制图,而且可以方便的将它作为绘图软件,嵌入GUI应用程序中
  2. Matplotlib库由各种可视化类构成,内部结构复杂
  3. Matplotlib.pyplot是绘制各类可视化图形的命令字库,相当于快捷方式
  4. Matplotlib文档完备,并且gallery页面中有上百幅缩略图,打开之后有源代码。如果需要绘制某种类型的图,只需要在这个页面上浏览、复制、粘贴一下,大多都能够通过修改数据和设置搞定

Gallery

快速绘图

  1. Matplotlib中的快速绘图的函数库可以通过import语句导入
  2. 调用figure创建一个绘图对象,并且使它成为当前的绘图对象
  3. 通过figure参数可以指定绘图对象的宽度和高度,单位为英寸;dpi参数指定绘图对象的分辨率,即每英寸可以多少个像素,缺省值为80
  4. 也可以不创建绘图对象直接调用plot函数直接绘图,Matplotlib会自动创建一个绘图对象
  5. 如果需要同时绘制多幅图标的话,可以给figure传递一个整数参数指定图标的序号,如果所指定序号的绘图对象已经存在的话,将不创建新的对象,而只是让它成为当前绘图对象
  6. plot函数的调用方式很灵活,使用关键字参数指定各种属性(label:给所绘制的曲线一个名字,此名字在图示(legend)中显示。color:指定曲线的颜色。linewidth:指定曲线的宽度。参数"b--":指定曲线的颜色和线型)
  7. plt.xlabel/ylabel:设置X轴/Y轴的文字
  8. plt.title:设置图标的标题
  9. plt.ylim:设置Y轴的范围
  10. plt.legend:图例图示
  11. plt.show():显示出创建的所有绘图对象
  12. plt.savefig()将当前的figure对象保存成图像文件,图像格式由图像文件的扩展名决定
import numpy as np
import matplotlib.pyplot as plt

x=np.linspace(0,10,100)
y=np.sin(x)
z=np.cos(x**2)

plt.plot(x,y,"r-",label="$sin(x)$",linewidth=2)
plt.plot(x,y,"b--",label="$cos(x^2)$")

plt.xlabel("Times(s)")
plt.ylabel("Volt")
plt.title("PyPlot First Example")
plt.legend()

plt.show()

折线图

折线图:通常用来表示数据随时间或有序类别变化的趋势

简单折线图

import matplotlib.pyplot as plt
data=[1,2,3,4,5,6,7,8,9,1,2,4,5,7,9]
#随意创建的数据
plt.plot(data)
#引用Matplotlib库中的pyplot模块绘图
plt.show()
  • plot()函数的第一个参数表示横坐标数据
  • 第二个表示纵坐标数据
  • 第三个表示颜色、线型和标记样式
  • 颜色常用的值有(r/g/b/c/m/y/k/w)
  • 线型常用的值(-/--/:/-.)
  • 标记样式常用的值有(./,/o/v/^/s/*/D/d/x/</>/h/H/1/2/3/4/_/|)
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm

yy=[1,2,3,4,5,3,1,2,7,8]#随便创建的数据
xx=[3,5,4,1,9,3,2,5,6,3]
zz=[2,2,4,7,4,8,2,4,5,6]
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')
plt.ylabel('y轴名称',fontproperties='simhei')
plt.title('折线图美化实例',fontproperties='simhei')
plt.ylim(0,10)
plt.show()

散点图

10个位置随机散点图

#10个点位置随机散点图
import matplotlib.pyplot as plt
import numpy as np

N=10
x=np.random.rand(N)
y=np.random.rand(N)
plt.scatter(x,y)
plt.show()

10个点随机大小 

#10个点随机大小
import matplotlib.pyplot as plt
import numpy as np

N=10
x=np.random.rand(N)
y=np.random.rand(N)
size=(30*np.random.rand(N))**2
plt.scatter(x,y,s=size)
plt.show()

更改散点颜色、透明度 

#更改散点颜色、透明度:颜色随机,透明度为0.5
import matplotlib.pyplot as plt
import numpy as np

N=10
x=np.random.rand(N)
y=np.random.rand(N)
size=(30*np.random.rand(N))**2
color=np.random.rand(N)
plt.scatter(x,y,s=size,c=color,alpha=0.5)
plt.show()

更改散点形状 

#更改散点形状,点形状改为上三角
import matplotlib.pyplot as plt
import numpy as np

N=10
x=np.random.rand(N)
y=np.random.rand(N)
size=(30*np.random.rand(N))**2
color=np.random.rand(N)
plt.scatter(x,y,s=size,c=color,alpha=0.5,marker="^")
plt.show()

一张图绘制两组数据 

#一张图绘制两组数据
import matplotlib.pyplot as plt
import numpy as np

N=10
x1=np.random.rand(N)
y1=np.random.rand(N)

x2=np.random.rand(N)
y2=np.random.rand(N)

plt.scatter(x1,y1,alpha=0.5,marker="^")
plt.scatter(x2,y2,alpha=0.5,marker="s")
plt.show()

为散点图增加图例 

#为散点图增加图例
import matplotlib.pyplot as plt
import numpy as np

N=10
x1=np.random.rand(N)
y1=np.random.rand(N)

x2=np.random.rand(N)
y2=np.random.rand(N)

plt.scatter(x1,y1,alpha=0.5,marker="^",label='triangle')
plt.scatter(x2,y2,alpha=0.5,marker="s",label="circle")
plt.legend(loc="best")#自己选择图例在合适的位置
plt.show()

柱状图

  1. 使用Matplotlib提供的bar()函数来绘制柱状图
  2. 与plot()函数类似,程序每次调用bar()函数时都会生成一组柱状图,如果希望生成多组柱状图,则可通过多次调用bar()函数来实现
bar(x,height,width=0.8,*,align='center',**kwargs)
  • x:包含所有柱子的下标的列表
  • height:y轴的数值序列,也是柱状图的高度,一般就是我们需要展示的数据
  • width:为柱状图的宽度,一般为0.8即可
  • align:柱子对齐方式,center和edge。center表示每根柱子是根据下标来对齐,edge则表示每根柱子全部以下标为起点,然后显示到下标的右边。如果不指定该参数,默认值是center。
  • color:每根柱子呈现的颜色,可指定一个固定的颜色或者一个列表
  • edgecolor:每根柱子边框的颜色
  • linewidth:每根柱子的边框宽度。如果没有设置该参数,默认无边框
  • tick_label:每根柱子上显示的标签,默认无标签
  • xerr:每根柱子顶部在横轴方向的线段长度
  • yerr:每根柱子顶端在纵轴方向的线段长度
  • ecolor:设置xerr和yerr的线段的颜色,可以指定一个固定值或者一个列表

简单柱状图

#简单柱状图
import matplotlib.pyplot as plt
num_list=[1.5,0.6,7.8,6]
plt.bar(range(len(num_list)),num_list)
plt.show()

设置柱子颜色 

#设置柱子的颜色
import matplotlib.pyplot as plt
num_list=[1.5,0.6,7.8,6]
plt.bar(range(len(num_list)),num_list,color='crgb')
plt.show()

设置标签 

#设置标签
import matplotlib.pyplot as plt
name_list=['Monday','Tuesday','Wednesday','Thursday']
num_list=[1.5,0.6,7.8,6]
plt.bar(range(len(num_list)),num_list,color='crgb',tick_label=name_list)
plt.show()

堆叠柱状图 

#堆叠柱状图
import matplotlib.pyplot as plt
name_list = ['Monday','Tuesday','Wednesday','Thursday']
num_list = [1.5,0.6,7.8,6]
num_list2 = [1,2,1,2]
plt.bar(range(len(num_list)),num_list,color='c',tick_label=name_list,label='boys')
plt.bar(range(len(num_list)),num_list2,color='m',tick_label=name_list,bottom=num_list,label='girls')
#bottom在第一个柱状图的基础
plt.legend()
plt.show()

横向柱状图 

#横向柱状图
import matplotlib.pyplot as plt
name_list = ['Monday','Tuesday','Wednesday','Thursday']
num_list = [1.5,0.6,7.8,6]
num_list2 = [1,2,1,2]
plt.barh(range(len(num_list)),num_list,color='c',tick_label=name_list,label='boys')
plt.barh(range(len(num_list)),num_list2,color='m',tick_label=name_list,label='girls')
#bottom在第一个柱状图的基础
plt.legend()
plt.show()

并列柱状图 

#并列柱状图
import matplotlib.pyplot as plt
name_list = ['Monday','Tuesday','Wednesday','Thursday']
num_list = [1.5,0.6,7.8,6]
num_list2 = [1,2,1,2]
x=list(range(len(num_list)))
total_width=0.8
n=2
width=total_width/2
plt.bar(x,num_list,color='c',tick_label=name_list,width=width,label='boys')
for i in range(len(x)):
    x[i]=x[i]+width
plt.bar(x,num_list2,color='m',tick_label=name_list,width=width,label='girls')
#bottom在第一个柱状图的基础
plt.legend(loc='best')
plt.show()

饼状图

  • 饼状图显示一个系列中各项的大小与各项总和的比例
  • 饼状图可自动根据数据的百分比画饼

绘制饼状图的基本语法:

  1. 创建数组x的饼图,每个楔形的面积由x/sum(x)决定;
  2. 若sum(x)<1,则x数组不会被标准化,x值即为楔形区域面积占比。注意,该种情况会出现1-sum(x)的空楔形
  3. 若sum(x)>1,则由x[i]/sum(x)算出每个楔形占比,饼图360°区域均被填充
  4. pie函数精讲
def pie(x, explode=None, labels=None, colors=None, autopct=None,
        pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=None,
        radius=None, counterclock=True, wedgeprops=None, textprops=None,
        center=(0, 0), frame=False, rotatelabels=False, hold=None, data=None)
  • x:(创建饼状图的数据,每一块)的比例,如果sum(x)>1会使用sum(x)归一化;
  • explode:(每一块)离开中心距离,一个list或数组
  • labels:list、optional、default:none;为每个楔形添加标签
  • color:array-like,optional,default:none;若无,则用currently active cycle中的颜色添加
  • autopct:控制饼图内百分比设置,可以使用format字符串或者format function:可以是整数('%d%%')、浮点数('%1.3f%%')、字符串('%s%%')、函数。
  • label distance:float,optional,default:1.1;label标记的绘图位置,相对于半径的比例,默认值为1.1,如<1则绘制饼图内侧
  • pctdistance:float,optional,default:0.6;类似于labeldistance,指定autopct的位置刻度,默认值为0.6
  • shadow:bool、optional、default:False;为饼图图画阴影(True)
  • startangle:float,optional,default:none;起始绘制角度,默认图是从x轴正方向逆时针画起,如设定=90则从y轴正方向画起
  • radius:float,optional,default:none;饼图的半径,若为none时,则默认为1
  • counterclock:bool、optional、default:True;指定分数方向,逆时针True或顺时针
  • wedgeprops:dict,optional,default:none;描述楔形边界线宽度值,参数形式“wedgeprops={‘linewidth’:3}”楔形边界线宽度为3
  • textprops:dict、optional,default:none;传递给文本对象的字典参数
  • center:list of float,optional,default:(0,0);图标的中心为,默认(0,0),也可以是两个标量的序列(sequence of 2 scalars)
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
labels='A','B','C','D'
sizes=[10,10,10,10]
plt.pie(sizes,labels=labels)
plt.title('简单饼状图')
plt.show()

一块饼图到中心的距离 

#explode参数:一块饼图到中心的距离,默认位0
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
labels='A','B','C','D'
sizes=[10,10,10,10]
#explode参数:一块饼图到中心的距离
explode=(0,0,0.1,0)

plt.pie(sizes,labels=labels,explode=explode)
plt.title('简单饼状图')
plt.show()

 标注每块饼图的颜色 

#colos:数组,可选参数,默认为none;用来标注每块饼图的Matplotlib颜色参数序列
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
labels='A','B','C','D'
sizes=[10,10,10,10]
color=['r','k','g','m']
#explode参数:一块饼图到中心的距离
explode=(0,0,0.1,0)

plt.pie(sizes,labels=labels,explode=explode,colors=color)
plt.title('简单饼状图')
plt.show()

控制饼图内百分比设置 

#autopct:控制饼图内百分比设置,可以使用format字符串或者format function
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
labels='A','B','C','D'
sizes=[10,10,10,10]
color=['r','c','g','m']
explode=(0,0,0.1,0)

plt.pie(sizes,labels=labels,explode=explode,colors=color,autopct='%1.1f%%')
plt.title('简单饼状图')
plt.show()
#x:每一块饼图的比例,为必填项,如果sum(x)>1,会将多余的部分进行均分
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
labels='A','B','C','D'
sizes=[0.1,0.2,0.3,0.2]
color=['r','c','g','m']
explode=(0,0,0.1,0)

plt.pie(sizes,labels=labels,explode=explode,colors=color,autopct='%1.1f%%')
plt.title('简单饼状图')
plt.show()

添加图例 

#添加图例,ply.legend()
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
labels='A','B','C','D'
sizes=[0.1,0.2,0.3,0.2]
color=['r','c','g','m']
explode=(0,0,0.1,0)

plt.pie(sizes,labels=labels,explode=explode,colors=color,autopct='%1.2f%%')
plt.title('简单饼状图')
plt.legend(loc="upper right",fontsize=8,borderaxespad = 0.3)
plt.show()

雷达图

  • 雷达图(Rader Chart),又可称为戴布拉图、蜘蛛网图(Spider Chart),可以很好的刻画出某些指标的横向或纵向的对比关系
  • 雷达图常用于对比项指标的全面分析
  • Python中用Matplotlib模块绘制雷达图需要用到极坐标系

polar函数

import numpy as np
import matplotlib.pyplot as plt
plt.polar(0.25*np.pi,20,'ro',lw=2)
plt.ylim(0,50)
plt.show()
#0.25*np.pi:极角
#20:极径
#‘ro’:绘极坐标形状为红色圆点
#lw=2:极坐标图形宽度为2

如果绘制多个极角和极轴

import numpy as np
import matplotlib.pyplot as plt
theta=np.array([0.25,0.5,0.75,1,1.25,1.5,1.75,2])
r=[75,60,50,70,50,85,45,70]
plt.polar(theta*np.pi,r,'cs',lw=2)
plt.ylim(0,100)
#设置y轴的范围
plt.show()
#0.25*np.pi:极角
#20:极径
#‘ro’:绘极坐标形状为红色圆点
#lw=2:极坐标图形宽度为2

闭合曲线

#闭合曲线:多构造一个极坐标点,和第一个点重叠
import numpy as np
import matplotlib.pyplot as plt
theta=np.array([0.25,0.5,0.75,1,1.25,1.5,1.75,2,0.25])
r=[75,60,50,70,50,85,45,70,75]
#最后一个极坐标与第一个参数相同
plt.polar(theta*np.pi,r,'cs--',lw=2)
plt.ylim(0,100)
#设置y轴的范围
plt.show()
#0.25*np.pi:极角
#20:极径
#‘ro’:绘极坐标形状为红色圆点
#lw=2:极坐标图形宽度为2

Fill()函数填充雷达图

#fill()函数填充雷达图
import numpy as np
import matplotlib.pyplot as plt
theta=np.array([0.25,0.5,0.75,1,1.25,1.5,1.75,2,0.25])
r=[75,60,50,70,50,85,45,70,75]
#最后一个极坐标与第一个参数相同
plt.polar(theta*np.pi,r,'cs--',lw=2)
plt.fill(theta*np.pi,r,facecolor='r',alpha=0.25)
#填充
plt.ylim(0,100)
#设置y轴的范围
plt.show()
#0.25*np.pi:极角
#20:极径
#‘ro’:绘极坐标形状为红色圆点
#lw=2:极坐标图形宽度为2

学生成绩清单雷达图

#导入库
import numpy as np
import matplotlib.pyplot as plt
#数据准备
courses=['Python','Java','C++',
         'C','PHP','R',]
scores=[10,20,30,40,50,60]
datalength=len(scores)
#等分圆,曲线闭合
angles=np.linspace(0,2*np.pi,datalength,endpoint=False)
scores.append(scores[0])
angles=np.append(angles,angles[0])
#绘图
plt.polar(angles,scores,'rv--',lw=2)
#设置标签
plt.thetagrids(angles*180/np.pi,courses,fontproperties='simhei')
#填充雷达图
plt.fill(angles,scores,facecolor='c',alpha=0.3)

plt.show()

三维图

  • Matplotlib支持一些基础的三维图表绘制,需要使用mpl_toolkits模块
  • 在绘制三维图形时,至少需要指定x、y、z三个坐标轴的数据,然后再根据不同的图形类型指定额外的参数设置图形的属性
plot_surface(X,Y,Z,*args,**kwargs)
  • 常用参数:
  • rstride和cstride分别控制x和y两个方向的步长,这决定了曲面上每个面片的大小
  • color指定面片的颜色
  • cmap指定面片的颜色映射表

三维散点图

p3d.Axes3D.scatter( xs, ys, zs=0, zdir=’z’, s=20, c=None, depthshade=True, 
                   *args, **kwargs )

p3d.Axes3D.scatter3D( xs, ys, zs=0, zdir=’z’, s=20, c=None, depthshade=True,
                   *args, **kwargs)
  • xs、ys、zs分别用来指定散点符号的x、y、z坐标,如果同时为标量则制定一个三点符号的坐标,如果同时为等长数组则指定一系列散点符号的坐标
  • s用来指定散点符号的大小,可以是标量或与xs等长的数组

三维柱状图

bar3d(self, x, y, z, dx, dy, dz, color=None, zsort='average', shade=True, lightsource=None, \*args, \*\*kwargs)[source]
  • x、y、z分别用来表示每个柱底面的坐标,如果这三个参数都是标量则指定一个柱的底面坐标、如果是三个等长的数组则指定多个柱的底面坐标
  • dx、dy、dz分别用来指定柱在三个坐标轴上的跨度,即x方向的宽度、y方向的厚度和z方向的高度
  • color用来指定柱的表面颜色
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

fig=plt.figure()
ax=fig.gca(projection='3d')

#测试数据
theta=np.linspace(-4*np.pi,4*np.pi,100)
z=np.linspace(-4,4,100)*0.3
r=z**4+1
x=r*np.sin(theta)
y=r*np.cos(theta)

ax.plot(x,y,z,'b^-',label='3D Picture Test')
mpl.rcParams['legend.fontsize']=20
ax.legend(loc='best')
plt.show()

猜你喜欢

转载自blog.csdn.net/weixin_43717681/article/details/106032827