首页 > 编程语言 >Python数据分析(一)--Matplotlib学习

Python数据分析(一)--Matplotlib学习

时间:2022-12-02 22:16:10浏览次数:61  
标签:None plt Python Matplotlib -- matplotlib ax np import

Matplotlib库学习

image-20221130195831545

2.1 Matplotlib库小测

image-20221130202835781

image-20221130212706326

2.2 Pyplot的绘图区域

plt.subplot(nrows, ncols, plot_number)

  • 图表的整个绘图区域被分成 numRows 行和 numCols
  • 然后按照从左到右,从上到下的顺序对每个子区域进行编号,左上的子区域的编号为1
  • plotNum 参数指定创建的 Axes 对象所在的区域

以plt.subplot(3,2,4)或者plt.subplot(324)为例:

image-20221130213749386

案例:

import numpy as np
import matplotlib.pyplot as plt


def f(t):
    return np.exp(-t) * np.cos(2 * np.pi * t)


a = np.arange(0.0, 5.0, 0.02)
plt.subplot(211)
plt.plot(a, f(a))

plt.subplot(212)
plt.plot(a, np.cos(2 * np.pi * a), 'r--')
plt.show()

image-20221130215605837

2.3 Pyplot的plot函数

plt.plot(x,y,format_string,**kwargs)
  • x:X轴数据,列表或数组,可选。
  • y:Y轴数据,列表或数组
  • format_string:控制曲线的格式字符串,可选。由颜色字符风格字符标记字符组成

颜色字符:

image-20221130221029407

风格字符:

image-20221130221223831

标记字符:

image-20221130221548092

  • **kwargs:第二组或更多(x,y,format_string)

color:控制颜色,color = 'green'

linestyle:线条风格,linestyle = 'dashed'

marker:标记风格,marker = 'o'

markerfacecolor:标记颜色,markerfacecolor = 'blue'

markersize:标记尺寸,markersize = 20

例一:

import matplotlib.pyplot as plt
import numpy as np

a = np.arange(10)
plt.plot(a, a * 1.5, 'go-', a, a * 2.5, 'rx', a, a * 3.5, '*', a, a * 4.5, 'b-.')
plt.show()

image-20221130221809930

例二:

import matplotlib.pyplot as plt
import numpy as np

a = np.arange(10)
plt.plot(a, a * 1.5, color='green', linestyle='dashed', marker='o', markerfacecolor='blue', markersize=5)
plt.show()

image-20221130222516552

2.4 Pyplot的中文显示

方法一

pyplot并不默认支持中文显示,需要rcParams修改字体实现

import matplotlib.pyplot as plt
import matplotlib

matplotlib.rcParams['font.family'] = 'SimHei'
plt.plot([3, 1, 4, 5, 2])
plt.ylabel('纵轴(值)')
plt.savefig('test1',dpi=600)
plt.show()

image-20221201151130726

  • Rcparams的属性

image-20221201151221283

  • 关于中文字体的种类(rcParams['font.family'])

image-20221201152121862

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

matplotlib.rcParams['font.family'] = 'STSong'
matplotlib.rcParams['font.size'] = 15
a = np.arange(0.0, 5.0, 0.02)
plt.xlabel('横轴:时间')
plt.ylabel('纵轴:振幅')
plt.plot(a, np.cos(2 * np.pi * a), 'r--')
plt.show()

image-20221201152749835

方法二

在有中文输出的地方,增加一个属性:fontproperties

import numpy as np
import matplotlib.pyplot as plt

a = np.arange(0.0, 5.0, 0.02)
plt.xlabel('横轴:时间', fontproperties='SimHei', fontsize=15)
plt.ylabel('纵轴:振幅', fontproperties='SimHei', fontsize=15)
plt.plot(a, np.cos(2 * np.pi * a), 'b--')
plt.show()

image-20221201153137745

2.5 Pyplot的文本显示函数

image-20221201153926795

import numpy as np
import matplotlib.pyplot as plt

a = np.arange(0.0, 5.0, 0.02)
plt.plot(a, np.cos(2 * np.pi * a), 'r--')

plt.xlabel('横轴:时间', fontproperties='SimHei', fontsize=15, color='green')
plt.ylabel('纵轴:振幅', fontproperties='SimHei', fontsize=15)
plt.title(r'正弦波实例 $y=cos(2\pi x)$', fontproperties='SimHei', fontsize=20)
plt.text(2, 1, r'$\mu=100$', fontsize=15)
plt.axis([-1, 6, -2, 2])  # x轴和y轴的范围
plt.grid(True)  # 显示网格线
plt.show()

image-20221201154625262

plt.annotate()函数用于标注文字

参数:

  • s 为注释文本内容

  • xy 为被注释的坐标点

  • xytext 为注释文字的坐标位置

  • xycoords 参数如下:

    • figure points:图左下角的点
    • figure pixels:图左下角的像素
    • figure fraction:图的左下部分
    • axes points:坐标轴左下角的点
    • axes pixels:坐标轴左下角的像素
    • axes fraction:左下轴的分数
    • data:使用被注释对象的坐标系统(默认)
    • polar(theta,r):if not native ‘data’ coordinates t
  • weight 设置字体线型

    • {‘ultralight’, ‘light’, ‘normal’, ‘regular’, ‘book’, ‘medium’, ‘roman’, ‘semibold’, ‘demibold’, ‘demi’, ‘bold’, ‘heavy’, ‘extra bold’, ‘black’}
  • color 设置字体颜色

    • {‘b’, ‘g’, ‘r’, ‘c’, ‘m’, ‘y’, ‘k’, ‘w’}
    • ‘black’,'red’等
    • [0,1]之间的浮点型数据
    • RGB或者RGBA, 如: (0.1, 0.2, 0.5)、(0.1, 0.2, 0.5, 0.3)等
  • arrowprops #箭头参数,参数类型为字典dict

    • width:箭头的宽度(以点为单位)
    • headwidth:箭头底部以点为单位的宽度
    • headlength:箭头的长度(以点为单位)
    • shrink:总长度的一部分,从两端“收缩”,两端留白
    • facecolor:箭头颜色
  • bbox给标题增加外框 ,常用参数如下:

    • boxstyle:方框外形
    • facecolor:(简写fc)背景颜色
    • edgecolor:(简写ec)边框线条颜色
    • edgewidth:边框线条大小
import numpy as np
import matplotlib.pyplot as plt

a = np.arange(0.0, 5.0, 0.02)
plt.plot(a, np.cos(2 * np.pi * a), 'r--')
plt.xlabel('横轴:时间', fontproperties='SimHei', fontsize=15, color='green')
plt.ylabel('纵轴:振幅', fontproperties='SimHei', fontsize=15)
# 标题
plt.title(r'正弦波实例 $y=cos(2\pi x)$', fontproperties='SimHei', fontsize=20)
# 注释
plt.annotate(r'$\mu=100$', xy=(2, 1), xytext=(3, 1.5),
             arrowprops=dict(facecolor='black', shrink=0.1, width=2))
plt.axis([-1, 6, -2, 2])  # x轴和y轴的范围
plt.grid(True)  # 显示网格线
plt.show()

image-20221201161459711

2.6 Pyplot基础图表函数

image-20221201175422687

image-20221201175549831

2.7 MyPlot饼图的绘制

方法:plt.pie()

参数:

参数 意义
x 浮点型数组,表示每个扇形的面积。
explode 数组,表示各个扇形之间的间隔,默认值为0。
labels 列表,各个扇形的标签,默认值为 None。
colors 数组,表示各个扇形的颜色,默认值为 None。
autopct 设置饼图内各个扇形百分比显示格式,%d%% 整数百分比,%0.1f 一位小数, %0.1f%% 一位小数百分比, %0.2f%% 两位小数百分比。
labeldistance 标签标记的绘制位置,相对于半径的比例,默认值为 1.1,如 <1则绘制在饼图内侧。
pctdistance 类似于 labeldistance,指定 autopct 的位置刻度,默认值为 0.6。
shadow 布尔值 True 或 False,设置饼图的阴影,默认为 False,不设置阴影。
radius 设置饼图的半径,默认为 1。
startangle 起始绘制饼图的角度,默认为从 x 轴正方向逆时针画起,如设定 =90 则从 y 轴正方向画起。
counterclock 布尔值,设置指针方向,默认为 True,即逆时针,False 为顺时针。
wedgeprops 字典类型,默认值 None。参数字典传递给 wedge 对象用来画一个饼图。例如:wedgeprops={'linewidth':5} 设置 wedge 线宽为5
textprops 字典类型,默认值为:None。传递给 text 对象的字典参数,用于设置标签(labels)和比例文字的格式。
center 浮点类型的列表,默认值:(0,0)。用于设置图标中心位置。
frame 布尔类型,默认值:False。如果是 True,绘制带有表的轴框架。
rotatelabels 布尔类型,默认为 False。如果为 True,旋转每个 label 到指定的角度。
import matplotlib.pyplot as plt

labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
sizes = [15, 30, 45, 10]
explode = (0, 0.1, 0, 0)

# sizes 是数据,labels 是标签,radius 是饼图半径
# explodes 为0代表不偏离圆心,不为零则代表偏离圆心的距离
plt.pie(sizes, explode=explode, labels=labels, radius=0.8,
        autopct='%1.1f%%', shadow=True, startangle=90,
        textprops={'fontsize': 15, 'color': 'black'})  # 标签和文本的格式
plt.axis('equal')  # 正圆
# 创建图例
# borderaxespad允许您设置锚点与loc指定的框架部分之间的距离
plt.legend(loc='upper right', bbox_to_anchor=(1.1, 1.05), fontsize=10, borderaxespad=0.3)
plt.show()

image-20221201182717945

2.8 Pyplot直方图的绘制

  • 直方图:将统计值的范围分段,即将整个值的范围分成一系列间隔,然后计算每个间隔中有多少值。

  • 直方图也可以被归一化以显示“相对”频率。 然后,它显示了属于几个类别中的每个类别的占比,其高度总和等于1。

import matplotlib.pyplot as plt

plt.hist(x, bins=None, range=None, density=None, weights=None, cumulative=False, bottom=None, histtype='bar', align='mid', orientation='vertical', rwidth=None, log=False, color=None, label=None, stacked=False, normed=None, *, data=None, **kwargs)

参数 含义
x 作直方图所要用的数据,必须是一维数组;多维数组可以先进行扁平化再作图;必选参数
bins 直方图的柱数,即要分的组数,默认为10
range 元组(tuple)或None;剔除较大和较小的离群值,给出全局范围;如果为None,则默认为(x.min(), x.max());即x轴的范围;
density 布尔值。如果为true,则返回的元组的第一个参数n将为频率而非默认的频数;
weights 与x形状相同的权重数组;将x中的每个元素乘以对应权重值再计数;如果normed或density取值为True,则会对权重进行归一化处理。这个参数可用于绘制已合并的数据的直方图
cumulative 布尔值;如果为True,则计算累计频数;如果normed或density取值为True,则计算累计频率
bottom 数组,标量值或None;每个柱子底部相对于y=0的位置。如果是标量值,则每个柱子相对于y=0向上/向下的偏移量相同。如果是数组,则根据数组元素取值移动对应的柱子;即直方图上下便宜距离
histtype {‘bar’, ‘barstacked’, ‘step’, ‘stepfilled’};'bar’是传统的条形直方图;'barstacked’是堆叠的条形直方图;'step’是未填充的条形直方图,只有外边框;‘stepfilled’是有填充的直方图;当histtype取值为’step’或’stepfilled’,rwidth设置失效,即不能指定柱子之间的间隔,默认连接在一起
align {‘left’, ‘mid’, ‘right’};‘left’:柱子的中心位于bins的左边缘;‘mid’:柱子位于bins左右边缘之间;‘right’:柱子的中心位于bins的右边缘
orientation {‘horizontal’, ‘vertical’}:如果取值为horizontal,则条形图将以y轴为基线,水平排列;简单理解为类似bar()转换成barh(),旋转90°
rwidth 标量值或None。柱子的宽度占bins宽的比例
log 布尔值。如果取值为True,则坐标轴的刻度为对数刻度;如果log为True且x是一维数组,则计数为0的取值将被剔除,仅返回非空的(frequency, bins, patches)
color 具体颜色,数组(元素为颜色)或None
label 字符串(序列)或None;有多个数据集时,用label参数做标注区分
stacked 布尔值。如果取值为True,则输出的图为多个数据集堆叠累计的结果;如果取值为False且histtype=‘bar’或’step’,则多个数据集的柱子并排排列
normed 是否将得到的直方图向量归一化,即显示占比,默认为0,不归一化;不推荐使用,建议改用density参数
edgecolor 直方图边框颜色
alpha 透明度

返回值(用参数接收返回值,便于设置数据标签)

  • n:直方图向量,即每个分组下的统计值,是否归一化由参数normed设定。当normed取默认值时,n即为直方图各组内元素的数量(各组频数);
  • bins: 返回各个bin的区间范围;
  • patches:返回每个bin里面包含的数据,是一个list。
import numpy as np
import matplotlib.pyplot as plt

np.random.seed(0)
mu, sigma = 100, 20  # 均值和标准差
a = np.random.normal(mu, sigma, size=100)

plt.hist(a, bins=30, density=True, align='mid', histtype='stepfilled', color='g', edgecolor='black', alpha=0.75)
plt.title('Histogram')
plt.show()

image-20221202151331394

import numpy as np
import matplotlib.pyplot as plt

# figsize:指定figure的宽和高,单位为英寸
# dpi参数指定绘图对象的分辨率
plt.figure(figsize=(10,8), dpi=80)
np.random.seed(0)
mu, sigma = 100, 20  # 均值和标准差
a = np.random.normal(mu, sigma, size=100)

n, bins, patches = plt.hist(a, bins=20, density=False, align='left', rwidth=0.8, color='g', edgecolor='black',
                            alpha=0.75,label='正态函数直方图')
for i in range(len(n)):
    plt.text(bins[i], n[i] * 1.02, int(n[i]), fontsize=12, horizontalalignment='center')
plt.title('Histogram')

plt.show()

image-20221202152855361

2.9 Pyplot极坐标的绘制

1.引入两个方法:

方法一array = numpy.linspace(start, end, num=num_points)将在startend之间生成一个统一的序列,共有num_points个元素。

参数:

  • start 范围的起点(包括)
  • end 范围的端点(包括)
  • num 序列中的总点数
  • endpoint 不在序列计算中包括最后一点

方法二:可通过plt.cm直接调用已在matplotlib中定制好的色板

2.极轴图 - 极坐标的柱状图

image-20221202161240982

import numpy as np
import matplotlib.pyplot as plt

N = 20
theta = np.linspace(0.0, 2 * np.pi, N, endpoint=False)
radii = 10 * np.random.rand(N)
width = np.pi / 4 * np.random.rand(N)
# 面向对象绘制极坐标
ax = plt.subplot(111, projection='polar')
bars = ax.bar(theta, radii, width=width, bottom=0.0)

for r, bar in zip(radii, bars):
    # 设置颜色,virdis的地方可以写其他的colormap
    bar.set_facecolor(plt.cm.viridis(r / 10.))
    bar.set_alpha(0.5)

plt.show()

image-20221202163732664

3.雷达图绘制

import numpy as np
import matplotlib.pyplot as plt


ax1 = plt.subplot(111, projection='polar')
ax1.set_title('Radar Map')

N = 20
theta = np.linspace(0.0, 2 * np.pi, N, endpoint=False)
data1 = 10 * np.random.rand(N)
data2 = 10 * np.random.rand(N)
data3 = 10 * np.random.rand(N)

ax1.plot(theta, data1, '.--', label='data1')
ax1.fill(theta,data1,alpha=0.2)
ax1.plot(theta, data2, '.--', label='data2')
ax1.fill(theta,data2,alpha=0.2)
ax1.plot(theta, data3, '.--', label='data3')
ax1.fill(theta,data3,alpha=0.2)
# 绘制雷达线
plt.show()

image-20221202164857610

2.10 Pyplot散点图的绘制

面向matlab库的方法

import matplotlib.pyplot as plt
import numpy as np

# 定义数据
x = np.random.rand(10)  # 取出10个随机数
y = x + x ** 2 - 10  # 用自定义关系确定y的值

# 绘图
# 1. 确定画布
plt.figure(figsize=(8, 4))  # figsize:确定画布大小

# 2. 绘图
plt.scatter(x,  # 横坐标
            y,  # 纵坐标
            c='red',  # 点的颜色
            label='function')  # 标签 即为点代表的意思
# 3.展示图形
plt.legend(loc='upper right', bbox_to_anchor=(1.1, 1.15), fontsize=10)  # 显示图例
plt.show()

image-20221202204122940

面向对象的方法

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots()
x = 10 * np.random.randn(100)
y = 10 * np.random.randn(100)
# ax.plot(x, y, 'o')
ax.scatter(x, y)
ax.set_title('Simple Scatter')
plt.show()

image-20221202203639994

2.11 面向对象绘图

具体看这一篇文章:(78条消息) python可视化(3-1)面向对象绘图(画布和子图,fig & ax)_遥远的小宇的博客-CSDN博客

对象 常用代号
画布 fig
子图(或者坐标系) ax
绘图对象(如散点,直方、折线等) ax.scatterax.histax.plot
坐标轴 ax.xaxis
坐标轴刻度 ax.xaxis.xtick
图例 ax.legend
轴标题 ax.xlabel

思路一:创建画布,在画布基础上创建子图

刚思路需先创建一个画布对象fig,并以此为基础,通过调用fig.add_subplot接口或fig.add_axes接口,逐个创建子图ax,后通过ax进行绘图对象的绘制及子图的修改。两者原理亦有些差别。

思路二:画布和子图同时创建(推荐)

在画布(fig)上一个个地add(add_subplot,add_axes)子图,往往效率不高,plt.subplots接口很好地解决了该问题,一步生成画布,并同时生成m行,n列的子图栅格。

案例一:在一张画布上,左边画一个折线图,右边画一个散点图

import matplotlib.pyplot as plt

# 生成画布和axes对象
# nrow1=1和ncols=2分别代表1行和两列
fig, ax = plt.subplots(nrows=1, ncols=2)
ax[0].plot([1, 2, 3], [4, 5, 6])
ax[1].scatter([1, 2, 3], [4, 5, 6])
plt.show()

image-20221202202804437

思路三:创建画布栅格

1.不均匀的栅格子图

一种创建栅格的方式,是在画布的基础上,增加一个栅格对象GridSpec

import matplotlib.gridspec as gridspec
import matplotlib.pyplot as plt

# plt.figure()是新建一个画布。如果有多个图依次可视化的时候,需要使用
plt.figure()
# 划分为九个格子
gs = gridspec.GridSpec(3, 3)

ax1 = plt.subplot(gs[0, :])
ax2 = plt.subplot(gs[1, :2])
ax3 = plt.subplot(gs[1:, 2])
ax4 = plt.subplot(gs[2, 0])
ax5 = plt.subplot(gs[2, 1])
ax1.text(0.5, 0.5, r'ax1', fontsize=15)
ax2.text(0.5, 0.5, r'ax2', fontsize=15)
ax3.text(0.5, 0.5, r'ax3', fontsize=15)
ax4.text(0.5, 0.5, r'ax4', fontsize=15)
ax5.text(0.5, 0.5, r'ax5', fontsize=15)
plt.show()

image-20221201165820483

2.栅格子图的合并-plt.subplot2grid

理念:设定网格,选中网格,确定选中行列区域数量,编号从0开始

plt.subplot2grid(GridSpec.CurSpec,colspan=1,rowspan=1)
* GridSpec:网格划分
* CurSpec:网格选中
* colspan:列方向上的跨度
* rowspan:行方向上的跨度

例一:

ax1区域:plt.subplot((3,3),(0,0),colspan=3)
...
ax2区域:plt.subplot((3,3),(1,0),colspan=2)
...
ax3区域:plt.subplot((3,3),(1,2),rowspan=2)
...
ax4区域:plt.subplot((3,3),(2,0))
...
ax5区域:plt.subplot((3,3),(2,1))

image-20221201164036006

标签:None,plt,Python,Matplotlib,--,matplotlib,ax,np,import
From: https://www.cnblogs.com/epochal/p/pyplot.html

相关文章

  • 制作一个跳跃的小球游戏
    代码如下:importsysimportpygamepygame.init()size=width,height=640,480screen=pygame.display.set_mode(size)color=(0,0,0)ball=pygame.image.l......
  • 2.1 实验:反病毒引擎扫描、编译时间、查壳、导入表查看、字符串查看--《恶意代码分析
    实验内容:1、将文件上传到http://www.VirusTotal.com进行分析并查看报告。文件匹配到了已有的反病毒软件特征吗?(国内用https://www.virscan.org/替代)2、这些文件是什么时候......
  • [ABC249F] Ignore Operations 题解
    [ABC249F]IgnoreOperationsSolution目录[ABC249F]IgnoreOperationsSolution更好的阅读体验戳此进入题面SolutionCodeUPD更好的阅读体验戳此进入题面存在变量$x......
  • C++类内模板与模板关键字.template
    C++类外模板参数与类内模板参数一般来说模板参数会声明在类的tag,以及类成员函数/非成员函数返回值之前;而修饰在类内部成员函数返回值的模板参数可以降低类实例构造,或调用......
  • JSP-概念、原理、脚本
    JSP-概念1.概念:JavaServerPages:java服务器端页面以理解为:一个特殊的页面,其中既可以指定定义html标签,又可以定义java代码用于简化书写......
  • 封装成帧和透明传输
    封装成帧和透明传输封装成帧封装成帧就是在一段数据的前后部分添加首部和尾部,这样就构成了一个帧。接收端在收到物理层上交的比特流后,就能根据首部和尾部的标记,从收到的......
  • CSS2
    边框边框属性 border-widthborder-styleborder-color#i1{border-width:2px;border-style:solid;border-color:red;}通常使用简写方式:#i1{b......
  • 基于redis的点赞功能
    初始代码@GetMapping("/likes/{id}")publicResultqueryBlogLikes(@PathVariable("id")Longid){//修改点赞数量blogService.update().setSql("liked=li......
  • java三大特性
    什么是面向对象面向对象变成的本质就是:以类的方式组织代码、以对象的组织封装数据抽象三大特性:封装、继承、多态从认识论角度考虑是现有对象后有类。对象,是具体的事物......
  • samba启动不了解决办法
    步骤一:在ubuntu14.04下如何配置samba就不多说了,我的问题是配置完成以后,从windows访问共享目录,都连上了,但是点开share文件夹却弹出没有权限访问的对话框。如下图所示:这个......