数据可视化库(Matplotlib)

2024-08-31 20:28
文章标签 数据 可视化 matplotlib

本文主要是介绍数据可视化库(Matplotlib),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

常规绘图方法

细节设置

子图和标注

风格设置

常用图表绘制

盒图

直方图和散点图

3D图

布局设置

常规绘图方法

首先导入工具包,一般用plt来当作Matplotlib的别名:

import matplotlib.pyplot as plt
%matplotlib inline

指定魔法指令之后,在Notebook中只需要执行画图操作就可以在界面进行展示,先来画一个简单的折线图,只需要把二维数据点对应好即可:

plt.plot([1,2,3,4,5],[1,4,9,16,25])
plt.xlabel('xlabel',fontsize=16)
plt.ylabel('ylabel')

给定横坐标[1,2,3,4,5],纵坐标[1,4,9,16,25],并且指明x轴与y轴的名称分别为xlabel和ylabel。 

细节设置

在plot()函数中可以设置很多细节参数,例如线条的种类。

不仅可以改变线条的形状,也可以自己定义颜色。

首先构造一组数据,然后选择不同的线条类型和颜色来观察一下输出效果:

plt.plot([1,2,3,4,5],[1,4,9,16,25],'-.')
plt.xlabel('xlabel',fontsize=16) #fontsize表示字体的大小
plt.ylabel('ylabel',fontsize=16)

plt.plot([1,2,3,4,5],[1,4,9,16,25],'-.',color='r')

 

还可以多次调用plot()函数来加入多次绘图的结果,其中颜色和线条参数也可以写在一起,例如,“r- -”表示红色的虚线:

tang_array=np.arange(0,10,0.5)
plt.plot(tang_array,tang_array,'r--')
plt.plot(tang_array,tang_array**2,'bs')
plt.plot(tang_array,tang_array**3,'go')

在用matplotlib绘图中,基本上你能想到的特征都有相应的控制参数,例如线条宽度、形状、大小 等:

x=np.linspace(-10,10)
y=np.sin(x)
plt.plot(x,y,linewidth=3.0) # 设置线条宽度

plt.plot(x,y,color='b',linestyle=':',marker='o',markerfacecolor='r',markersize=10)

 

line=plt.plot(x,y)
plt.setp(line,color='r',linewidth=2.0,alpha=0.4) #alpha表示透明程度

 

子图和标注

所谓子图就是指一整幅图形中包含几个单独的小图,这些子图可以按照行或者列的形式排列

plt.subplot(211)
plt.plot(x,y,color='r')
plt.subplot(212)
plt.plot(x,y,color='b')

 

subplot(211)表示要画的图整体是2行1列的,一共包括两幅子图,最后的1表示当前绘制顺序是第一幅子图。subplot(212)表示还是这个整体,只是在顺序上要画第2个位置上的子图。

上图就是2行1列的子图绘制结果,整体表现为竖着排列,如果想横着排列,那就是1行2列了:

plt.subplot(121)
plt.plot(x,y,color='r')
plt.subplot(122)
plt.plot(x,y,color='b')

不仅可以创建一行或者一列,还可以创建多行多列,指定好整体规模,然后在对应位置画各个子图 就可以了,如果在当前子图位置没有执行绘图操作,该位置子图也会空出来:

plt.subplot(321)
plt.plot(x,y,color='r')
plt.subplot(324)
plt.plot(x,y,color='b')

绘图完成之后,通常会在图上加一些解释说明,也就是标注:

plt.plot(x,y,color='b',linestyle=':',marker='o',markerfacecolor='r',markersize=10)
plt.xlabel('x:---')
plt.ylabel('y:---')
#图题
plt.title('xiao mi yue:---')
plt.text(0,0,'xiao mi yue')# 在指定位置添加注释
plt.grid(True) #显示网络
plt.annotate('xiaomiyue',xy=(-5,0),xytext=(-2,0.3),arrowprops=dict(facecolor='red',shrink=0.05,headlength=20,headwidth=20))
#添加箭头,需给定起始和终止位置以及箭头的各种属性

上图中显示了网格,有时为了整体的美感和需求也可以把网格隐藏起来,通过plt.gca()来获得当前图表,然后改变其属性值:

x=range(10)
y=range(10)
fig=plt.gca()
plt.plot(x,y)
fig.axes.get_xaxis().set_visible(False)
fig.axes.get_yaxis().set_visible(False)

上述输出结果看起来光秃秃的不好看,还是往里面添加一些实际数据吧,估计更多人喜欢隐藏上方 和右方的坐标轴,然后带着网格线,可能更好看一些:

import math
x=np.random.normal(loc=0.0,scale=1.0,size=300)
width=0.5
bins=np.arange(math.floor(x.min())-width,math.ceil(x.max())+width,width)
ax=plt.subplot(111)
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)#去掉上方和右方的坐标轴线
plt.tick_params(bottom='off',top='off',left='off',right='off')#可以自己选择隐藏坐标轴上的锯齿线
plt.grid()#加入网络
plt.hist(x,alpha=0.5,bins=bins)#绘制直方图

在细节设置中,可以调节的参数太多,例如在x轴上,如果字符太多,横着写容易堆叠在一起了,这该怎么办呢?

x=range(10)
y=range(10)
labels=['xiaomiyue' for i in range(10)]
fig,ax=plt.subplots()
plt.plot(x,y)
plt.title('xiaomiyue')
ax.set_xticklabels(labels,rotation=45,horizontalalignment='right')

横着写不下,也可以斜着写,这些都可以自定义设置。在绘制多个线条或者多个类别数据时,之前我们用颜色来区别,但是还没有给出颜色和类别的对应关系,此时就需要使用legend()函数来指定:

x=np.arange(10)
for i in range(1,4):plt.plot(x,i*x**2,label='Group %d' %i)
plt.legend(loc='best')

其中loc='best'相当于让工具包自己找一个合适的位置来显示图表中颜色所对应的类别,当然其位置也可以自己指定,那么都有哪些可选项呢?别忘了help函数,可以直接打印出所有可调参数:

print(help(plt.legend))

loc参数中还可以指定特殊位置:

fig=plt.figure()
ax=plt.subplot(111)
x=np.arange(10)
for i in range(1,4):plt.plot(x,i*x**2,label='Group %d' %i)
ax.legend(loc='upper center',bbox_to_anchor=(0.5,1.15),ncol=3)

在Matplotlib中,绘制一个图表还是比较容易的,只需要传入数据即可,但是想把图表展示得完美就得慢慢调整了,其中能涉及的参数还是比较多的。最偷懒的方法就是寻找一个绘图的模板,然 后把所需数据传入即可,在Matplotlib官网和Sklearn官网的实例中均有绘好的图表,这些都可以作为平时的积累。

风格设置

首先可以查看一下Matplotlib有哪些能调用的风格,代码如下:

plt.style.available
['Solarize_Light2','_classic_test_patch','_mpl-gallery','_mpl-gallery-nogrid','bmh','classic','dark_background','fast','fivethirtyeight','ggplot','grayscale','seaborn-v0_8','seaborn-v0_8-bright','seaborn-v0_8-colorblind','seaborn-v0_8-dark','seaborn-v0_8-dark-palette','seaborn-v0_8-darkgrid','seaborn-v0_8-deep','seaborn-v0_8-muted','seaborn-v0_8-notebook','seaborn-v0_8-paper','seaborn-v0_8-pastel','seaborn-v0_8-poster','seaborn-v0_8-talk','seaborn-v0_8-ticks','seaborn-v0_8-white','seaborn-v0_8-whitegrid','tableau-colorblind10']

默认的风格代码如下:

x=np.linspace(-10,10)
y=np.sin(x)
plt.plot(x,y)

可以通过plt.style.use()函数来改变当前风格,再来尝试几种:

plt.style.use('dark_background')
plt.plot(x,y)

plt.style.use('bmh')
plt.plot(x,y)

 

plt.style.use('ggplot')
plt.plot(x,y)

 

常用图表绘制

在对比数据特征的时候,条形图是最常用的方法,在Matplotlib中的调用方法也很简单:

np.random.seed(0)
x=np.arange(5)
y=np.random.randint(-5,5,5)
fig,axes=plt.subplots(ncols=2)
v_bars=axes[0].bar(x,y,color='red')#正常的条形图
h_bars=axes[1].barh(x,y,color='red')#横着画
#通过子图索引来分别设置各自细节
axes[0].axhline(0,color='grey',linewidth=2)
axes[1].axvline(0,color='grey',linewidth=2)
plt.show()

在绘图过程中,有时需要考虑误差棒,以表示数据或者实验的偏离情况,做法也很简单,在bar()函数中,已经有现成的yerr和xerr参数,直接赋值即可:

mean_values=[1,2,3]#数值
variance=[0.2,0.4,0.5]#误差棒
bar_label=['bar1','bar2','bar3']#名字
x_pos=list(range(len(bar_label)))#指定位置
plt.bar(x_pos,mean_values,yerr=variance,alpha=0.3)#带有误差棒的条形图
#可以自己设置x轴和y轴的取值范围
max_y=max(zip(mean_values,variance))
plt.ylim([0,(max_y[0]+max_y[1])*1.2])
plt.ylabel('variable y')
plt.xticks(x_pos,bar_label)
plt.show()

既然是进行数据的对比分析,也可以加入更多对比细节,先把条形图绘制出来,细节都可以慢慢添加:

data=range(200,225,5)
bar_labels=['a','b','c','d','e']#要对比的类别名称
#指定画图区域大小
fig=plt.figure(figsize=(10,8))
#一会要横着画图所以在y轴上找每个起始位置
y_pos=np.arange(len(data))
#在y轴上写上各个类别名字
plt.yticks(y_pos,bar_labels,fontsize=16)
#绘制条形图指定颜色和透明度
bars=plt.barh(y_pos,data,alpha=0.5,color='g')
#画一条竖线,至少需要三个参数,即x轴位置也就是在哪画,y轴的起始位置和终止位置
plt.vlines(min(data),-1,len(data)+0.5,linestyle='dashed')
#在对应位置写上注释,这里写了随意计算的结果
for b,d in zip(bars,data):plt.text(b.get_width()+b.get_width()*0.05,b.get_y()+b.get_height()/2,'{0:.2%}'.format(d/min(data)))
plt.show()

 

如果想把条形图画得更个性一些,也可以让各种线条看起来不同:

patterns=('-','+','x','\\','*','o','O','.')#这些图形对应下面的绘图结果
mean_value=range(1,len(patterns)+1)#让条形图数值递增看起来舒服点
x_pos=list(range(len(mean_value)))
bars=plt.bar(x_pos,mean_value,color='white')
for bar,pattern in zip(bars,patterns):bar.set_hatch(pattern)
plt.show()

盒图

盒图(boxplot)主要由最小值(min)、下四分位数(Q1)、中位数(median)、上四分位数(Q3)、最大值(max) 五部分组成。当然也可以按照自己的喜好加入其他指标,代码如下:

tang_data=[np.random.normal(0,std,100) for std in range(1,4)]
fig=plt.figure(figsize=(8,6))
plt.boxplot(tang_data,sym='s',vert=True)
plt.xticks([y+1 for y in range(len(tang_data))],['x1','x2','x3'])
plt.xlabel('x')
plt.title('box plot')

 

在每一个小盒图中,从下到上就分别对应之前说的5个组成部分,计算方法如下:

•IQR=Q3–Q1,即上四分位数与下四分位数之间的差;

•min=Q1–1.5×IQR,正常范围的下限;

•max=Q3+1.5×IQR,正常范围的上限。

其中的方块代表异常点或者离群点,离群点就是超出上限或下限的数据点,所以用盒图可以很方便 地观察离群点的情况。

boxplot()函数就是主要绘图部分,其他细节部分都是通用的。sym参数用来展示异常点的符号,可以 用正方形,也可以用加号,这取决于你的喜好。vert参数表示是否要竖着画,它与条形图一样,也可以横着画。可选参数还是比较多的,如果大家想看完整的参数,最直接的办法就是:

print(help(plt.boxplot))

还有一种图形与盒图长得有点相似,叫作小提琴图(violinplot)。绘制方法也相同,可以对比一下:

fig,axes=plt.subplots(nrows=1,ncols=2,figsize=(12,5))#接着画两个图来对比
tang_data=[np.random.normal(0,std,100) for std in range(6,10)]
#左边画小提琴图
axes[0].violinplot(tang_data,showmeans=False,showmedians=True)
axes[0].set_title('violin plot')
#右边画盒图
axes[1].boxplot(tang_data)
axes[1].set_title('box plot')for ax in axes:#为了对比更清晰一些把网格画出来ax.yaxis.grid(True)#指定x轴画的位置ax.set_xticks([y+1 for y in range(len(tang_data))])#设置x轴上指定的名字ax.set_xticklabels(['x1','x2','x3','x4'])

小提琴图给人以“胖瘦”的感觉,越“胖”表示当前位置的数据点分布越密集,越“瘦”则表示此处数据点 比较稀疏。小提琴图没有展示出离群点,而是从数据的最小值、最大值开始展示。

直方图和散点图

直方图(Histogram)可以更清晰地表示数据的分布情况,还是先画一个来看看:

data = np.random.normal(0,20,1000)
bins = np.arange(-100,100,5)plt.hist(data,bins=bins)
plt.xlim([min(data)-5,max(data)+5])
plt.show()

画直方图的时候,需要指定一个bins,也就是按照什么区间来划分,例如np.arange(−10,10,5)=array([−10,−5,0,5])。

如果想同时展示不同类别数据的分布情况,也可以分别绘制,但是要更透明一些,否则就会堆叠在 一起:

import random
data1 = [random.gauss(15,10) for i in range(500)]
data2 = [random.gauss(5,5) for i in range(500)]
bins = np.arange(-50,50,2.5)plt.hist(data1,bins=bins,label='class 1',alpha = 0.3)
plt.hist(data2,bins=bins,label='class 2',alpha = 0.3)
plt.legend(loc='best')#用不同颜色表示不同类别
plt.show()

散点图就更常见啦,只要有数据就能绘制,通常还可以用散点图来表示特征之间的相关性,调用 scatter()函数即可:

N=1000
x=np.random.randn(N)
y=np.random.randn(N)
plt.scatter(x,y,alpha=0.3)
plt.grid(True)
plt.show()

3D图

 如果要展示三维数据情况,就需要用到3D图:

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = fig.add_subplot(111,projection='3d')
plt.show()

这样就形成了一个空白的3D图,接下来只需要往里面填充数据即可:

np.random.seed(1)
def randrange(n,vmin,vmax):return (vmax-vmin)*np.random.rand(n)+vmin
fig = plt.figure()ax = fig.add_subplot(111,projection = '3d')
n = 100
#颜色和标记以及取值范围
for c,m,zlow,zhigh in [('r','o',-50,-25),('b','x','-30','-5')]:xs = randrange(n,23,32)ys = randrange(n,0,100)zs = randrange(n,int(zlow),int(zhigh))ax.scatter(xs,ys,zs,c=c,marker=m)
plt.show()

由于3D图是立体的,还可以对其进行旋转操作,以不同的视角观察结果,只需在最后加入 ax.view_init()函数,并在其中设置旋转的角度即可.

其他图表的3D图绘制方法相同,只需要调用各自的绘图函数即可:

fig = plt.figure()  
ax = fig.add_subplot(111, projection='3d') for c, z in zip(['r', 'g', 'b', 'y'], [30, 20, 10, 0]): xs = np.arange(20)ys = np.random.rand(20)cs = [c]*len(xs)ax.bar(xs,ys,zs = z,zdir='y',color = cs,alpha = 0.5)
plt.show()

布局设置

几种基本的绘图方法都给大家进行了演示,把多个图表总结在一起进行对比也是很常见的方法,之前讲解了调用子图的方法,但是看起来各个部分都是同样的大小,没有突出某一主题,使用时也可以自定义子图的布局:

#3*3的布局,第一个子图
ax1=plt.subplot2grid((3,3),(0,0))
#布局大小都是3*3,各自位置不同
ax2=plt.subplot2grid((3,3),(1,0))
#可以都占用一些位置一个顶三个
ax3=plt.subplot2grid((3,3),(0,2),rowspan=3)
#同上,一个顶两个
ax4=plt.subplot2grid((3,3),(2,0),colspan=2)
ax5=plt.subplot2grid((3,3),(0,1),rowspan=2)

不同子图的规模不同,在布局时,也可以在图表中再嵌套子图:

本章介绍了可视化库Matplotlib的基本使用方法,绘制图表还是比较方便的,只需1行核心代码就够 了,如果想画得更精致,就要用各种参数慢慢尝试。其实在进行绘图展示的时候很少有人自己从头去 写,基本上都是拿一个差不多的模板,再把实际需要的数据传进去,现在给大家推荐——sklearn工具包 的官方实例,里面有很多可视化展示结果,画得比较精致,而且都和机器学习相关,需要时直接取一个模板即可。

这篇关于数据可视化库(Matplotlib)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1124909

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X

pandas数据过滤

Pandas 数据过滤方法 Pandas 提供了多种方法来过滤数据,可以根据不同的条件进行筛选。以下是一些常见的 Pandas 数据过滤方法,结合实例进行讲解,希望能帮你快速理解。 1. 基于条件筛选行 可以使用布尔索引来根据条件过滤行。 import pandas as pd# 创建示例数据data = {'Name': ['Alice', 'Bob', 'Charlie', 'Dav

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者