数据分析三剑客之一:Matplotlib详解与实战

 1 Matplotlib介绍

 Matplotlib是Python中最常用的可视化工具之一,可以非常方便地创建海量类型的2D图表和一些基本的3D图表。

26304f2023fc404093c0d7bcf519c5a6.png

Matplotlib提供了一个套面向绘图对象编程的API接口,能够很轻松地实现各种图像的绘制,并且它可以配合Python GUI工具(如 PyQt、Tkinter 等)在应用程序中嵌入图形。同时 Matplotlib 也支持以脚本的形式嵌入到 IPython shell、Jupyter 笔记本、web 应用服务器中使用。

1.1 Matplotlib架构组成

matplotlib框架分为三层,这三层构成了一个栈,上层可以调用下层。

c33a8d63eca34d87ba9596e8aa70a7af.png

 

1.1.1 脚本层

主要用于可视化编程,pytplot模块可以提供给我们一个与matplotlib打交道的接口。可以只通过调用pyplot模块的函数从而操作整个程序包,来绘制图形。

  • 操作或者改动Figure对象,例如创建Figure对象
  • 大部分工作是处理样本文件的图形与坐标的生成

1.1.2 美工层

图形中所有能看到的元素都属于Artist对象,即标题、轴标签、刻度等组成图形的所有元素都是Artist对象的实例。

  • Figure:指整个图形(包括所有的元素,比如标题、线等)。
  • Axes(坐标系):axes是子图对象,子图对象指的是x和y轴。axes 常用有set_xlabel()、set_ylabel()设置x和y轴坐标名字。
  • Axis(坐标轴):坐标系中的一条轴,包含大小限制、刻度和刻度标签。

一个figure(图)可以包含多个axes(坐标系),但是一个axes只能属于一个figure。一个axes(坐标系)可以包含多个axis(坐标轴),包含两个即为2d坐标系,3个即为3d坐标系。

eb3c23a5f03b4a49a9d470e0c4782430.png

 

1.1.3 后端层

matplotlib的底层,实现了大量的抽象接口类,这些API用来在底层实现图形元素的一个个类。

  • FigureCanvas对象实现了绘图区域这一概念。
  • Renderer对象在FigureCanvas上绘图。

1.2 Pyplot介绍

通过Pyplot 对数据进行图形化展示,可以直观的了解数据的分布情况,更好的制定出学习方法。同时,它还可以展示出我们机器学习到的计算方法,了解其与实际情况是否相符等问题。

  • Pyplot 是 Matplotlib 的子库,提供了和 MATLAB 类似的绘图 API。
  • Pyplot 是常用的绘图模块,能很方便让用户绘制 2D 图表。
  • Pyplot 包含一系列绘图函数的相关函数,每个函数会对当前的图像进行一些修改,例如:给图像加上标记,生成新的图像,在图像中产生新的绘图区域等等。

Pyplot 绘图流程如下:

68b259d3f9bf4c679671bfd6acec10b4.png

 

2 Pyplot函数

Pyplot 包含一系列绘图函数的相关函数,每个函数会对当前的图像进行一些修改

  • plot():用于绘制线图和散点图
  • scatter():用于绘制散点图
  • bar():用于绘制垂直条形图和水平条形图
  • hist():用于绘制直方图
  • pie():用于绘制饼图
  • imshow():用于绘制图像
  • subplots():用于创建子图

2.1 plt.plot参数说明

plt.plot(x,y,format_string,**kwargs)

`plt.plot()`函数是Matplotlib库中用于绘制线条图的函数,它有多个参数可以控制绘图的各个方面。以下是常用的一些参数:

  • x: x轴数据的列表或数组
  • y: y轴数据的列表或数组
  • linewidth: 线条的宽度,从0到无穷大的浮点数,例如2.5
  • color: 线条的颜色,可以是字符串、元组或RGBA值,代表不同的颜色。例如:红色'red'、绿色'green'、蓝色'blue'、黑色'black'、白色'white'、灰色'gray'等;RGB元组(0, 0, 1)表示蓝色,RGBA元组(0, 1, 0, 0.5)表示半透明的绿色
  • linestyle: 线条的样式,可以是字符串,如实线'-'、虚线'--'、点线':'、破折线'-.'等

  '-': 实线

  '--': 虚线

  '-.': 点划线

  ':': 点线

  '': 无线条,只显示标记

  'None': 无线条,不显示标记

  ' ': 无线条,不显示标记

  • marker: 数据点的标记样式
标记字符说明标记字符说明标记字符说明
' . '点标记' 1 '下花三角' h '竖六边形
' , '像素标记' 2 '上花三角' H '横六边形
' o '实心圆' 3 '左花三角' + '十字标记
' v '倒三角' 4 '右花三角' x 'x标记
' ^ '上三角' s '实心方形' D '菱形标记
' > '右三角' p '实心五角' d '菱形标记
' < '左三角' * '星形标记' | '直线标记

 

  • markersize: 标记的大小,从0到无穷大的浮点数,例如7.5
  • label: 字符串类型,代表绘制的线条的标签,在图例中显示。例如Line 1
  • alpha: 线条和标记的透明度,从0到1的浮点数,表示线条和标记的透明度。例如0.5
  • zorder: 整数类型,表示绘图的层数,数值越大越靠上。例如2

还有一些其他参数:

  • solid_capstyle: 实线端点的样式,如普通平直样式"butt"、圆角样式"round"、斜角样式"projecting"等
  • dash_capstyle: 虚线端点的样式,与solid_capstyle类似
  • dash_joinstyle: 虚线连接处的样式,如圆弧连接"round"、斜接连接"bevel"、锐角连接"miter"等
  • solid_joinstyle: 实线连接处的样式,与dash_joinstyle类似
  • markevery: 标记显示的间隔,可以是数字、元组或者函数,可以是数字、元组或者函数。例如:每隔一个数据点标记一个点:markevery=2;从第二个开始,每个5个数据点标记一个点:markevery=(1, 5);根据某个函数的返回值来控制标记的位置:markevery=lambda i: i%3==0

`plt.plot()`函数的参数比较多,不同的参数组合可以实现各种各样的效果。

2.2 plt.scatter参数说明

matplotlib.pyplot.scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, *, edgecolors=None, plotnonfinite=False, data=None, **kwargs)
  • x, y → 散点的坐标,float or array-like, shape (n, )
  • s → 散点的面积,float or array-like, shape (n, ), optional
  • c → 散点的颜色(默认值为蓝色,'b',其余颜色同plt.plot( ))
  • marker → 散点样式(默认值为实心圆,'o',其余样式同plt.plot( ))
  • alpha → 散点透明度([0, 1]之间的数,0表示完全透明,1则表示完全不透明)
  • linewidths →散点的边缘线宽
  • edgecolors → 散点的边缘颜色

2.3 plt.bar参数说明

bar(x, height, width=0.8, bottom=None, ***, align='center', data=None, **kwargs)
  • x 表示x坐标,数据类型为int或float类型,
  • height 表示柱状图的高度,也就是y坐标值,数据类型为int或float类型,
  • width 表示柱状图的宽度,取值在0~1之间,默认为0.8
  • bottom 柱状图的起始位置,也就是y轴的起始坐标,
  • align 柱状图的中心位置,"center","lege"边缘
  • color 柱状图颜色
  • edgecolor 边框颜色
  • linewidth 边框宽度
  • tick_label 下标标签
  • log 柱状图y周使用科学计算方法,bool类型
  • orientation 柱状图是竖直还是水平,竖直:"vertical",水平条:"horizontal"

 2.4 plt.hist参数说明

matplotlib.pyplot.hist(  
    x, bins=10, range=None, normed=False,   
    weights=None, cumulative=False, bottom=None,   
    histtype=u'bar', align=u'mid', orientation=u'vertical',   
    rwidth=None, log=False, color=None, label=None, stacked=False,   
    hold=None, **kwargs)  
  • x : (n,) array or sequence of (n,) arrays,这个参数是指定每个bin(箱子)分布的数据,对应x轴
  • bins : integer or array_like, optional,这个参数指定bin(箱子)的个数,也就是总共有几条条状图
  • normed : boolean, optional,If True, the first element of the return tuple will be the counts normalized to form a probability density, i.e.,n/(len(x)`dbin),这个参数指定密度,也就是每个条状图的占比例比,默认为1
  • color : color or array_like of colors or None, optional,这个指定条状图的颜色

3.5 plt.pie参数说明

pyplot.pie(x, explode=None, labels=None, colors=None, autopct=None)
  • x: 数组序列,数组元素对应扇形区域的数量大小。
  • labels: 列表字符串序列,为每个扇形区域备注一个标签名字。
  • colors; 为每个扇形区域设置颜色,默认按照颜色周期自动设置。
  • autopct: 格式化字符串"fmt%pct",使用百分比的格式设置每个扇形区的标签,并将其放置在扇形区内。
  • pctdistance:设置百分比标签与圆心的距离;
  • labeldistance:设置各扇形标签(图例)与圆心的距离;
  • explode: 指定饼图某些部分的突出显示,即呈现爆炸式;()
  • shadow:是否添加饼图的阴影效果

2.6 plt.imshow参数说明

matplotlib.pyplot.imshow(X, cmap=None, norm=None, aspect=None, interpolation=None, alpha=None, vmin=None, vmax=None, origin=None,extent=None, shape=None, filternorm=1, filterrad=4.0, imlim=None, resample=None, url=None, hold=None, data=None, **kwargs)
  • X:图像数据。支持的数组形状是:

    • (M,N) :带有标量数据的图像。数据可视化使用色彩图。
    • (M,N,3) :具有RGB值的图像(float或uint8)。
    • (M,N,4) :具有RGBA值的图像(float或uint8),即包括透明度。
      前两个维度(M,N)定义了行和列图片,即图片的高和宽;
      RGB(A)值应该在浮点数[0, ..., 1]的范围内,或者
      整数[0, ... ,255]。超出范围的值将被剪切为这些界限。
  • cmap:将标量数据映射到色彩图,颜色默认为:rc:image.cmap
  • norm :~matplotlib.colors.Normalize,如果使用scalar data ,则Normalize会对其进行缩放[0,1]的数据值内。默认情况下,数据范围使用线性缩放映射到颜色条范围。 RGB(A)数据忽略该参数。

  • aspect:{'equal','auto'}或float,可选,控制轴的纵横比。该参数可能使图像失真,即像素不是方形的。equal:确保宽高比为1,像素将为正方形。(除非像素大小明确地在数据中变为非正方形,坐标使用 extent )。auto: 更改图像宽高比以匹配轴的宽高比。通常,这将导致非方形像素。

  • interpolation:str,使用的插值方法,支持的值有:'none', 'nearest', 'bilinear', 'bicubic','spline16', 'spline36', 'hanning', 'hamming', 'hermite', 'kaiser','quadric', 'catrom', 'gaussian', 'bessel', 'mitchell', 'sinc','lanczos'.如果interpolation = 'none',则不执行插值

  • alpha:alpha值,介于0(透明)和1(不透明)之间。RGBA输入数据忽略此参数。

  • vmin, vmax : scalar,如果使用* norm 参数,则忽略 vmin vmax *。vmin,vmax与norm结合使用以标准化亮度数据。
  • origin : {'upper', 'lower'},将数组的[0,0]索引放在轴的左上角或左下角。'upper'通常用于矩阵和图像。请注意,垂直轴向上指向“下”但向下指向“上”。
  • extent:(left, right, bottom, top)数据坐标中左下角和右上角的位置。 如果为“无”,则定位图像使得像素中心落在基于零的(行,列)索引上。

2.7 plt.subplots参数说明

matplotlib.pyplot.subplots(nrows=1, ncols=1, sharex=False, sharey=False, squeeze=True, subplot_kw=None, gridspec_kw=None, **fig_kw)
  • nrows,ncols:整型,可选参数,默认为1。表示子图网格(grid)的行数与列数。
  • sharex,sharey:布尔值或者{'none','all','row','col'},默认:False,控制x(sharex)或y(sharey)轴之间的属性共享:

   1.True或者'all':x或y轴属性将在所有子图(subplots)中共享.

   2.False或'none':每个子图的x或y轴都是独立的部分
   3.'row':每个子图在一个x或y轴共享行(row)
   4.'col':每个子图在一个x或y轴共享列(column)

当子图在x轴有一个共享列时('col'),只有底部子图的x tick标记是可视的。同理,当子图在y轴有一个共享行时('row'),只有第一列子图的y tick标记是可视的。

  • squeeze:布尔类型,可选参数,默认:True。

如果是True,额外的维度从返回的Axes(轴)对象中挤出。
        如果只有一个子图被构建(nrows=ncols=1),结果是单个Axes对象作为标量被返回。
        对于N*1或1*N个子图,返回一个1维数组。
        对于N*M,N>1和M>1返回一个2维数组。
如果是False,不进行挤压操作:返回一个元素为Axes实例的2维数组,即使它最终是1x1。

  • subplot_kw:字典类型,可选参数。把字典的关键字传递给add_subplot()来创建每个子图。
  • gridspec_kw字典类型,可选参数。把字典的关键字传递给GridSpec构造函数创建子图放在网格里(grid)。
  • **fig_kw:把所有详细的关键字参数传给figure()函数 

3 Matplotlib绘图

3.1 绘制一条直线

import matplotlib.pyplot as plt

plt.plot([1,2,3,4])
plt.ylabel('some numbers')
plt.show()

我们为plot命令提供了一个list或者是array,matplotlib认为这个序列是Y轴上的取值,并且会自动生成X轴上的值。因为python中的范围是从0开始的,因此X轴就是从0开始,长度与Y的长度相同,也就是[0,1,2,3],所以显示如下:

f4a33c99f4804cd1abf8e61209d5204c.png

 3.2 绘制一条折线

import matplotlib.pyplot as plt

plt.plot([1, 2, 3, 4], [1, 4, 9, 16])
plt.ylabel('some numbers')
plt.show()

plot的参数可以是任意数量,上面参数表示的是(x,y)对,(1,1)(2,4)(3,9)(4,16)。这里有第三个可选参数,它是字符串格式的,表示颜色和线的类型。它是颜色字符串和线的类型字符串的组合。默认情况下,该字符串参数是’b-‘,表示蓝色的实线。显示如下:

126b3772758545898666e8b898c084ec.png

 3.3 绘制一个点集

import matplotlib.pyplot as plt

plt.plot([1, 2, 3, 4], [1, 4, 9, 16], 'ro')
plt.axis([0, 6, 0, 20])
plt.show()

'ro'表示红色圆圈绘制上述点集,显示如下:

1eb57961a82c41eeba4989bee83a080a.png

3.4 通过numpy数据绘制多个点集

import numpy as np
import matplotlib.pyplot as plt

# 0到5之间每隔0.2取一个数
t = np.arange(0., 5., 0.2)

# 红色的破折号,蓝色的方块,绿色的三角形
plt.plot(t, t, 'r--', t, t**2, 'bs', t, t**3, 'g^')
plt.show()

构建三组numpy数据,通过不同的样式展示出来,显示如下:

0675d8c0b67e443b82b1292b102b920a.png

 3.5 绘制多图形(figures)和多坐标系(axes)

import numpy as np
import matplotlib.pyplot as plt

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

t1 = np.arange(0.0, 5.0, 0.1)
t2 = np.arange(0.0, 5.0, 0.02)

plt.figure("2subplot")
plt.subplot(211)
plt.plot(t1, f(t1), 'bo', t2, f(t2), 'k')

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

pyplot所有的绘图命令都是应用于当前图形(figure)和当前坐标系(axes),分别在两个坐标系绘制一个图形,显示如下:

bef23bd4618948dbadeb78690fe69a64.png

 3.6 绘图直方图

import numpy as np
import matplotlib.pyplot as plt

mu, sigma = 100, 15
x = mu + sigma * np.random.randn(10000)

# 直方图
n, bins, patches = plt.hist(x, 50, normed=1, facecolor='g', alpha=0.75)

plt.xlabel('Smarts')
plt.ylabel('Probability')
plt.title('Histogram of IQ')
plt.text(60, .025, r'$\mu=100,\ \sigma=15$')
plt.axis([40, 160, 0, 0.03])
plt.grid(True)
plt.show()

text()命令可以被用来在任何位置添加文字,xlabel()、ylabel()、title()被用来在指定位置添加文字。所有text()命令返回一个matplotlib.text.Text实例,可以通过关键字参数在text()定制文本样式,也可以通过setp()来定制文字的样式: 

t = plt.xlabel('my data', fontsize=14, color='red')
setp(t,color='blue')

e0e8de499bbf4caf8b3336a463d0cc4d.png

import matplotlib.pyplot as plt
import numpy as np

# 生成三组随机数据
data1 = np.random.normal(0, 1, 1000)
data2 = np.random.normal(2, 1, 1000)
data3 = np.random.normal(-2, 1, 1000)

# 绘制直方图
plt.hist(data1, bins=30, alpha=0.5, label='Data 1')
plt.hist(data2, bins=30, alpha=0.5, label='Data 2')
plt.hist(data3, bins=30, alpha=0.5, label='Data 3')

# 设置图表属性
plt.title('matplotlib hist() ')
plt.xlabel('Value')
plt.ylabel('Frequency')
plt.grid()
plt.legend()

# 显示图表
plt.show()

5107e284bcc24caba3f05e04b15a28d2.png

3.7 绘制Y轴使用不同刻度下的曲线图

import numpy as np
import matplotlib.pyplot as plt

# 在区间[0,1]制造一些数据
# np.random.normal为高斯分布
y = np.random.normal(loc=0.5, scale=0.4, size=1000)
y = y[(y > 0) & (y < 1)]
y.sort()
x = np.arange(len(y))

# 创建一个窗口
plt.figure(1)

# 线性
plt.subplot(221)
plt.plot(x, y)
plt.yscale('linear')
plt.title('linear')
plt.grid(True)

# 对数
plt.subplot(222)
plt.plot(x, y)
plt.yscale('log')
plt.title('log')
plt.grid(True)

# symmetric log
plt.subplot(223)
plt.plot(x, y - y.mean())
plt.yscale('symlog', linthreshy=0.05)
plt.title('symlog')
plt.grid(True)

# logit
plt.subplot(224)
plt.plot(x, y)
plt.yscale('logit')
plt.title('logit')
plt.grid(True)

plt.show()

 matplotlib.pylot不仅仅提供了线性的坐标,还提供了对数(logarithmic)和分对数(logit)坐标。当数据的维度跨越许多数量级时,这种坐标就很有用

c55b0557e4f140b1b3be0f6b4ee42bc2.png

 3.8 绘制散点图

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

x = np.random.randn(50)
y = np.random.randn(50)  
color =  np.random.rand(50)
changecolor = colors.Normalize(vmin=0.4, vmax=0.8)
plt.scatter(x, y, c=color, s=60, alpha=0.3, cmap='viridis',norm=changecolor)
plt.colorbar()  # 显示颜色条
plt.show()

参数 vmin、vmax 分别为要设置的数据范围的最小值和最大值(注意:设置之后,原来大于vmax的值被“拉低”成vmax;原来小于vmin的值被“拉高”成vmin) 

class matplotlib.colors.Normalize(vmin=None, vmax=None)

5af91dab79b4488492cbdecc9c758233.png

颜色表如下:

8c4c5672ebab44e6a6ac8096c2642abc.png

 

import numpy as np
import matplotlib.pyplot as plt

# 随机数生成器的种子
np.random.seed(2)
N = 50
x = np.random.rand(N)
y = np.random.rand(N)
colors = np.random.rand(N)
area = (30 * np.random.rand(N))**2  # 0 to 15 point radii

plt.scatter(x, y, s=area, c=colors, alpha=0.5) # 设置颜色及透明度

plt.title("matplotlib Scatter ") # 设置标题
plt.colorbar()

plt.show()

8e54a83ef053424a91964ae9f43c03f7.png

 

 3.9 绘制饼图

import matplotlib.pyplot as plt

#定义饼的标签,
labels = ['one','two','three','four','five','other']

#每个标签所占的数量
x = [200,500,1200,7000,200,900]

#饼图分离
explode = (0.03,0.05,0.06,0.04,0.08,0.1)

#设置阴影效果
#plt.pie(x,labels=labels,autopct='%3.2f%%',explode=explode,shadow=True)

plt.pie(x,labels=labels,autopct='%3.2f%%',explode=explode, labeldistance=1.35, pctdistance=1.2)
plt.legend()
plt.show()

7eda5616db164197afc1c58c0a5e40a8.png

 3.10 绘制条形图

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

# 将全局的字体设置为黑体
matplotlib.rcParams['font.family'] = 'SimHei'

# 数据
N = 5
y = [20, 10, 30, 25, 15]
x = np.arange(N)

# 绘图 x x轴, height 高度, 默认:color="blue", width=0.8
p1 = plt.bar(x, height=y, width=0.5, )

# 展示图形
plt.show()

2c85f6adfaf64c54b0cbe9adf47ae3b6.png

"""
    水平条形图,需要修改以下属性
    orientation="horizontal"
"""
import numpy as np
import matplotlib.pyplot as plt
 
# 数据
N = 5
x = [20, 10, 30, 25, 15]
y = np.arange(N)
 
# 绘图 x= 起始位置, bottom= 水平条的底部(左侧), y轴, height 水平条的宽度, width 水平条的长度
p1 = plt.bar(x=0, bottom=y, height=0.5, width=x, orientation="horizontal")
 
# 展示图形
plt.show()

cbb7774e7bdd476ca1cd9ca53b1c5837.png

import numpy as np
import matplotlib.pyplot as plt

# 设置画布颜色为 blue
plt.style.use("seaborn-v0_8-whitegrid")
fig, ax = plt.subplots()


# y 轴数据
data = [[5,25,50,20],
        [4,23,51,17],
        [6,22,52,19]]

X = np.arange(4)
width=0.25

plt.bar(X+width*0, data[0], color = 'darkorange', width = width,label = 'A')
plt.bar(X+width*1, data[1], color = 'steelblue', width =width,label="B")
plt.bar(X+width*2, data[2], color = 'violet', width = width,label = 'C')


# 添加文字描述
W = [width*0,width*1,width*2]# 偏移量
for i in range(3):
    for a,b in zip(X+W[i],data[i]):#zip拆包
        plt.text(a,b,"%.0f"% b,ha="center",va= "bottom")#格式化字符串,保留0位小数
 
plt.xlabel("Group")
plt.ylabel("Num")

# 在(0,48)这个位置,显示note 这个值
plt.text(1,48,"note",fontsize=15, ha='left', rotation=15, wrap=True)   


# family参数是一个字体参数
plt.text(1.5,32,"deep",fontsize=15, ha='left', rotation=15, wrap=True,
         bbox=dict(boxstyle='round,pad=0.5', fc='yellow', ec='k',lw=1 ,alpha=0.5))   


plt.legend()
plt.show()

d580bc5eb76a414b853544579cff0ecc.png

 

 3.11 绘制多子图

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

fig.text(0.5, 0, 'x', ha='center')
fig.text(0, 0.5, 'y', va='center')

x = np.linspace(0, 2*np.pi, 50, endpoint=False)
sins = np.sin(x)
coss = np.cos(x)

ax[1][1].plot(x, sins, 'r', alpha=0.5, lw=0.5, ls='-', marker='+', label='sin')
ax2 = ax[1][1].twinx()
ax2.plot(x, coss, 'g', alpha=0.5, lw=0.5, ls='-', marker='+', label='cos')
for tl in ax2.get_yticklabels():
    tl.set_color("r")
    
plt.tight_layout()
plt.show()

a55063e586a444c2abf4e4e6b28346ca.png

 3.12 绘制时间变化图

import random
import time
 
import matplotlib.pyplot as plt
from pylab import mpl
 
mpl.rcParams["font.sans-serif"] = ["SimHei"]  # 设置显示中文字体
mpl.rcParams["axes.unicode_minus"] = False  # 设置正常显示符号
 
x = range(1, 101)
times = [random.randint(10, 200) for i in range(100)]
plt.figure(figsize=(15, 5), dpi=80)  # 创建画布
plt.plot(x, times, color='r', linestyle='-', label='t = 2', marker='v')  # 绘制折线图,点划线
 
plt.legend(loc=0)  # 显示图例
# 描述信息
plt.xlabel("设备数/个")
plt.ylabel("时间/s")
plt.title("时间变化图", fontsize=18)
 
plt.savefig("./time.jpg")  # 保存至指定位置
plt.show()  # 显示图像

b53e43083e37411ebba97aba365807c8.png

3.13 绘制多张图片显示

# opencv显示
import cv2
# plt显示
from PIL import Image
import matplotlib.pyplot as plt


PATH = 'D:/dataset/cat_dog/valid/3.jpg'
plt.rcParams['font.sans-serif'] = ['SimHei']  # 显示中文

plt.subplot(1, 3, 1)
im = Image.open(PATH)
plt.imshow(im)
plt.xlabel('原图')

plt.subplot(1, 3, 2)
im = cv2.imread(PATH, 0)  # 参数0为灰度显示,参数1为RGB显示
plt.imshow(im, cmap='gray')
plt.xlabel('单通道图')

plt.subplot(1, 3, 3)
im = cv2.imread(PATH, 0)  # 参数0为灰度显示,参数1为RGB显示
im = cv2.equalizeHist(im)  # 直方图均衡
plt.imshow(im, cmap='gray')
plt.xlabel('直方图')

plt.show()

be2b2c53026c4934a4861230e4d65e41.png

 3.14 绘制3D图

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# 生成3D figure
fig = plt.figure()
ax = Axes3D(fig, auto_add_to_figure=False)
fig.add_axes(ax)

# X, Y value
X = np.arange(-4, 4, 0.25)
Y = np.arange(-4, 4, 0.25)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X ** 2 + Y ** 2)

Z = np.sin(R)

ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=plt.get_cmap('rainbow'), edgecolor='k')
ax.contourf(X, Y, Z, zdir='z', offset=-2, cmap='rainbow')

ax.set_zlim(-2, 2)
plt.show()

 

0883458c43a44386955d584c443c31cc.png

 

import numpy as np
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
#定义坐标轴
fig = plt.figure()
ax1 = plt.axes(projection='3d')
#ax = fig.add_subplot(111,projection='3d')  #这种方法也可以画多个子图
#定义三维数据
xx = np.arange(-5,5,0.5)
yy = np.arange(-5,5,0.5)
X, Y = np.meshgrid(xx, yy)
Z = np.sin(X)+np.cos(Y)
#作图
ax1.plot_surface(X,Y,Z)
ax1.contour(X,Y,Z, zdim='z',offset=-2,cmap='rainbow')   #等高线图,要设置offset,为Z的最小值

fig = plt.figure()  #定义新的三维坐标轴
ax3 = plt.axes(projection='3d')
#定义三维数据
xx = np.arange(-5,5,0.5)
yy = np.arange(-5,5,0.5)
X, Y = np.meshgrid(xx, yy)
Z = np.sin(X)+np.cos(Y)
#作图
ax3.plot_surface(X,Y,Z,cmap='rainbow')
ax3.contour(X,Y,Z, zdim='z',offset=-2,cmap='rainbow')   #等高线图,要设置offset,为Z的最小值
plt.show()

fed79bbad60d45908e4e370c43c817ea.png

 3.15 给绘图添加注释

import matplotlib.pyplot as plt
import numpy as np

fig, geeeks = plt.subplots()

t = np.arange(0.0, 5.0, 0.001)
s = np.cos(3 * np.pi * t)
line = geeeks.plot(t, s, lw=2)

# Annotation
geeeks.annotate('Local Max', xy=(3.3, 1),
                xytext=(3, 1.8),
                arrowprops=dict(facecolor='green',
                                shrink=0.05), )

geeeks.set_ylim(-2, 2)

# Plot the Annotation in the graph
plt.show()

annotate()方法添加注释,有两点需要注意:需要被注释的地方,使用xy参数来指出,还有就是注释文本所放置的位置,使用参数xytext来指定位置,这两个参数都是(x,y)元组,这里的xy和xytext所使用的坐标是根据XY轴的刻度的坐标,称为data coordinates。

d088a6f7ae684981a24e89c520823f87.png

 

import numpy as np 
import matplotlib.pyplot as plt 
  
x = np.arange(0, 10, 0.005) 
y = np.exp(-x / 3.) * np.sin(3 * np.pi * x) 
  
fig, ax = plt.subplots() 
ax.plot(x, y) 
ax.set_xlim(0, 10) 
ax.set_ylim(-1, 1) 
  
# Setting up the parameters 
xdata, ydata = 5, 0
xdisplay, ydisplay = ax.transData.transform((xdata, ydata)) 
  
bbox = dict(boxstyle ="round", fc ="0.8") 
arrowprops = dict( 
    arrowstyle = "->", 
    connectionstyle = "angle, angleA = 0, angleB = 90,\ 
    rad = 10") 
  
offset = 72
  
# Annotation 
ax.annotate('data = (%.1f, %.1f)'%(xdata, ydata), 
            (xdata, ydata), xytext =(-2 * offset, offset), 
            textcoords ='offset points', 
            bbox = bbox, arrowprops = arrowprops) 
  
  
disp = ax.annotate('display = (%.1f, %.1f)'%(xdisplay, ydisplay), 
            (xdisplay, ydisplay), xytext =(0.5 * offset, -offset), 
            xycoords ='figure pixels', 
            textcoords ='offset points', 
            bbox = bbox, arrowprops = arrowprops) 
  
# To display the annotation 
plt.show()

 

7c6796b43fb04c56a8223d0fbb175f8e.png

 

 

 

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Python金融数据分析是一门应用Python编程语言进行金融数据处理和分析的技术。进行金融数据分析可以帮助金融从业人员了解市场趋势、制定交易策略和评估风险。 CSDN是一个IT技术社区,提供了大量关于Python金融数据分析的学习资源和实战项目。 首先,入门阶段,我们可以通过CSDN学习Python语言的基础知识,包括数据类型、控制结构、函数等;学习Python中与金融数据处理和分析相关的库,如NumPy、Pandas、matplotlib等,掌握这些库的使用方法。 接下来,我们可以通过CSDN提供的教程和案例学习如何使用Python进行金融数据预处理,包括数据清洗、缺失值处理、数据标准化等;学习如何使用Python进行金融数据可视化,通过绘制图表展示数据的趋势和关联性。 进一步地,我们可以通过CSDN上的实战项目学习如何应用Python进行金融数据分析。例如,可以学习如何使用Python进行金融时间序列分析,预测股票价格;学习如何使用Python进行金融风险管理,评估投资组合的风险;学习如何使用Python进行金融文本数据分析,从新闻和社交媒体等大量文本数据中挖掘金融市场的信息等。 通过CSDN提供的学习资源和实战项目,我们可以逐步掌握Python金融数据分析的技能,并将其应用于实际金融问题的解决中。不断学习和实践将使我们在金融行业中具备竞争力,并能够更好地抓住市场机遇。 ### 回答2: Python金融数据分析入门到实战是一门在CSDN学习的课程,旨在教会学员如何使用Python进行金融数据分析,并能够运用所学知识在实际项目中进行实战。 这门课程首先介绍了Python在金融数据分析领域的重要性和应用场景。随着金融行业数据量的迅速增长,使用Python进行数据分析已经成为必不可少的技能之一。接着,课程会引导学员搭建Python开发环境,并介绍常用的金融数据分析工具和库,如pandas、numpy等。 在学习过程中,学员将学到如何读取金融数据,并进行数据的清洗和预处理。这是数据分析的第一步,只有数据质量好,才能进行有效的分析。之后,课程将重点讲述如何利用Python进行数据可视化。通过绘制各种图表和图像,可以更直观地展示数据的分布、趋势和关联性,为后续的分析提供更好的依据。 除此之外,课程还会介绍金融数据分析中的常见算法和模型,例如回归分析、时间序列分析、机器学习等。学员将了解不同算法的原理和应用场景,并能够利用Python实现这些算法。通过实战项目,学员可以更好地理解算法和模型的实际应用,提高自己的数据分析能力。 最后,该课程还会涉及一些金融市场的实战案例,如股票分析、投资组合优化等。学员可以应用所学的知识和工具,对真实的金融数据进行分析和预测,为投资决策提供支持。 总而言之,Python金融数据分析入门到实战课程通过理论与实践结合的方式,教会学员如何使用Python进行金融数据分析。通过该课程的学习,学员可以掌握数据处理、数据可视化、算法应用等技能,并能够将其应用于实际金融项目中。这门课程对于有意向从事金融数据分析工作的人员来说,具有很高的实用价值。 ### 回答3: Python是一种高级编程语言,通过它可以进行金融数据分析。在金融领域,数据分析是非常重要的,可以帮助人们做出更好的金融决策,预测市场走势,评估投资风险等。 Python具有丰富的库和模块,多样的功能可以用于金融数据分析,其中最为常用的包括Pandas,Numpy,Matplotlib等。 Pandas是处理和分析金融数据的重要库,它提供了灵活的数据结构和数据处理工具,使得数据预处理和清洗变得更加简单。Pandas还提供了大量的统计函数和方法,方便用户对数据进行统计分析。 Numpy是Python中一个重要的数值计算库,它提供了很多数学函数和处理数组的功能,非常适合用来进行数值计算和矩阵操作。在金融数据分析中,可以利用Numpy来进行金融计算、统计量计算和回归等分析。 Matplotlib是一种绘图库,通过它可以制作各种图表,如折线图、柱状图、散点图等。在金融数据分析中,我们可以使用Matplotlib来可视化数据,以便更直观地理解数据的特征和趋势。 在学习Python金融数据分析的过程中,可以参考CSND上的教程。这个教程包括从入门到实战的内容,可以帮助初学者快速掌握Python金融数据分析基本知识和技能。此外,还可以通过阅读相关书籍和参加培训课程来深入学习和实践。 总之,Python金融数据分析是一个很有前景和实用性的领域,通过学习Python和相关库的使用,可以更加高效地进行金融数据分析,并取得更好的分析结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智慧医疗探索者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值