数据可视化(Python)

本文详细介绍了Python的matplotlib库用于数据可视化的功能,包括绘制折线图、散点图、直方图,以及如何设置坐标轴、添加图例、调整线条样式和颜色。此外,还讲解了如何使用numpy进行数值计算,并展示了如何在图表上添加文字、填充区间、使用色彩映射,以及处理中文显示。内容覆盖了从基础图表到复杂数据展示的多个方面。
摘要由CSDN通过智能技术生成

机器学习中许多时候需要将数据可视化,方便更直观地表现目前的数据。

 

安装方法:

pip install matplotlib

matplotlib是一个庞大的绘图库模块。pyplot子模块可以完成许多图表绘制。

认识matplotlib.pyplot模块的主要函数

绘制图表
函数名称说明
plot绘制折线图
scatter绘制散点图
hist绘制直方图

坐标轴设定
函数名称说明
title(标题)设定坐标轴的标题
axis()可以设定坐标轴的最小和最大刻度范围
xlim(x_Min,x_Max)设定x轴的刻度范围
ylim(y_Min,y_Max)设定y轴的刻度范围
label(名称)设定图表标签图例
xlabel(名称)设定x轴的名称
ylabel(名称)设定y轴的名称
xticks(刻度值)设定x轴刻度值
yticks(刻度值)设定y轴刻度值
tick_params()设定坐标轴的刻度大小、颜色
legend()设定坐标的图例
text()在坐标轴指定位置输出字符串
grid()图表增加网格线
show()显示图表
cla()清除图表

图片的读取与储存
函数名称说明
imread(文件名)读取图片文件
savefig(文件名)将图片存入文件

绘制简单的折线图plot()

常用语法格式如下:

plot(x, y, lw=x, ls='x', label='xxx', color)

x:x轴系列值。

y:y轴系列值。

lw:linewidth的缩写,折线图的线条宽度。预设线条宽度是1,参数设定线条的粗细。

ls:linestyle的缩写,折线图的线条样式。

color:缩写是c,设置色彩。

label:图表的标签

画线基础实践

square[]列表有9笔数据代表y轴值,数据基本上是x轴索引0~8的平方值序列。

import matplotlib.pyplot as plt

x=[x for x in range(9)]
squares=[0,1,4,9,16,25,36,49,64]
plt.plot(x,squares)
plt.show()

运行结果:

省略x轴数据 

import matplotlib.pyplot as plt

squares=[0,1,4,9,16,25,36,49,64]
plt.plot(squares)
plt.show()

运行结果如同上一个实例。

将x轴刻度设为0~8,y轴刻度设为0~70。

import matplotlib.pyplot as plt

squares=[0,1,4,9,16,25,36,49,64]
plt.plot(squares)
plt.axis(0,8,0,70)
plt.show()

运行结果: 

增加网络线

import matplotlib.pyplot as plt

squares=[0,1,4,9,16,25,36,49,64]
plt.plot(squares)
plt.axis([0, 8, 0, 70])
plt.grid()
plt.show()

运行结果

线条宽度linewidth

设定线条宽度是10,使用lw=10。

import matplotlib.pyplot as plt

squares=[0,1,4,9,16,25,36,49,64]
plt.plot(squares,lw=10)
plt.show()

运行结果

标题的显示

title(标题名称,fontsize=字号)

xlabel(标题名称,fontsize=字号)

ylabel(标题名称,fontsize=字号)

默认字号大小是12。

使用默认字号为图表与x、y轴建立标题。

import matplotlib.pyplot as plt

squares=[0,1,4,9,16,25,36,49,64]
plt.plot(squares,lw=10)
plt.title('Test Chart')
plt.xlabel('Value')
plt.ylabel('Square')
plt.show()

运行结果:

使用设定字号24建立图标标题,字号16建立x、y轴标题。

import matplotlib.pyplot as plt

squares=[0,1,4,9,16,25,36,49,64]
plt.plot(squares,lw=10)
plt.title('Test Chart',fontsize=24)
plt.xlabel('Value',fontsize=16)
plt.ylabel('Square',fontsize=16)
plt.show()

运行结果:

坐标轴刻度的设定

在设计图表时可以使用tick_params()设计设定坐标轴的刻度大小、颜色以及应用范围。

tick_paramas(axis='xx', labelsize=xx, color='xx')

如果axis的xx是both,代表应用到x轴和y轴;如果xx是x,代表应用到x轴;如果xx是y,代表应用到y轴;

使用不同刻度与颜色绘制图表。

import matplotlib.pyplot as plt

squares = [0, 1, 4, 9, 16, 25, 36, 49, 64]
plt.plot(squares, lw=10)       # 列表squares数据是y轴的值, 线条宽度是10
plt.title('Test Chart', fontsize=24)
plt.xlabel('Value', fontsize=16)
plt.ylabel('Square', fontsize=16)
plt.tick_params(axis='both', labelsize=12, color='red')
plt.show()

运行结果:

多组数据的应用

plot(seq,第一组数据,seq,第二组数据,...)

设计含多组数据的图表。

import matplotlib.pyplot as plt

data1 = [1, 4, 9, 16, 25, 36, 49, 64]           # data1线条
data2 = [1, 3, 6, 10, 15, 21, 28, 36]           # data2线条
seq = [1,2,3,4,5,6,7,8]
plt.plot(seq, data1, seq, data2)                # data1&2线条
plt.title("Test Chart", fontsize=24)
plt.xlabel("x-Value", fontsize=14)
plt.ylabel("y-Value", fontsize=14)
plt.tick_params(axis='both', labelsize=12, color='red')
plt.show()

运行结果:

线条色彩与样式

常见的色彩
色彩字符色彩说明
'b'blue(蓝色)
'c'cyan(青色)
'g'green(绿色)
'k'black(黑色)
'm'magenta(品红)
'r'red(红色)
'w'white(白色)
'y'yellow(黄色)

常见的样式
字符说明
‘-’或‘solid’实线
‘--’或‘dashed’虚线
‘-.’或‘dashdot’虚点线
‘:’或‘dotted’点线
‘.’点标记
‘,’像素标记
‘o’圆标记
‘v’反三角标记
‘^’三角标记
‘<’左三角形
‘>’右三角形
‘s’方形标记
‘p’五角标记
‘*’星星标记
‘+’加号标记
‘-’减号标记
‘x’X标记
‘H’六边形1标记
‘h’六边形2标记

上述可以混合使用,例如‘r-.’代表红色虚点线。

采用不同色彩与线条样式绘制图表

import matplotlib.pyplot as plt

data1 = [1, 2, 3, 4, 5, 6, 7, 8]                # data1线条
data2 = [1, 4, 9, 16, 25, 36, 49, 64]           # data2线条
data3 = [1, 3, 6, 10, 15, 21, 28, 36]           # data3线条
data4 = [1, 7, 15, 26, 40, 57, 77, 100]         # data4线条

seq = [1, 2, 3, 4, 5, 6, 7, 8]
plt.plot(seq, data1, 'g--', seq, data2, 'r-.', seq, data3, 'y:', seq, data4, 'k.')   
plt.title("Test Chart", fontsize=24)
plt.xlabel("x-Value", fontsize=14)
plt.ylabel("y-Value", fontsize=14)
plt.tick_params(axis='both', labelsize=12, color='red')
plt.show()

重新设计上图绘制线条 ,同时为各个点加上标记。

import matplotlib.pyplot as plt

data1 = [1, 2, 3, 4, 5, 6, 7, 8]                # data1线条
data2 = [1, 4, 9, 16, 25, 36, 49, 64]           # data2线条
data3 = [1, 3, 6, 10, 15, 21, 28, 36]           # data3线条
data4 = [1, 7, 15, 26, 40, 57, 77, 100]         # data4线条

seq = [1, 2, 3, 4, 5, 6, 7, 8]
plt.plot(seq, data1, '-*', seq, data2, '-o', seq, data3, '-^', seq, data4, '-s')   
plt.title("Test Chart", fontsize=24)
plt.xlabel("x-Value", fontsize=14)
plt.ylabel("y-Value", fontsize=14)
plt.tick_params(axis='both', labelsize=12, color='red')
plt.show()

刻度设计

假设3大品牌车辆2021-2023的销售数据如下:

import matplotlib.pyplot as plt

Benz = [3367, 4120, 5539]               # Benz线条
BMW = [4000, 3590, 4423]                # BMW线条
Lexus = [5200, 4930, 5350]              # Lexus线条

seq = [2021, 2022, 2023]                # 年度
plt.plot(seq, Benz, '-*', seq, BMW, '-o', seq, Lexus, '-^')   
plt.title("Sales Report", fontsize=24)
plt.xlabel("Year", fontsize=14)
plt.ylabel("Number of Sales", fontsize=14)
plt.tick_params(axis='both', labelsize=12, color='red')
plt.show()

运行结果:

使用pyplot模块的xticks()、yticks()分别设置x、y轴刻度。

import matplotlib.pyplot as plt

Benz = [3367, 4120, 5539]               # Benz线条
BMW = [4000, 3590, 4423]                # BMW线条
Lexus = [5200, 4930, 5350]              # Lexus线条

seq = [2021, 2022, 2023]                # 年度
plt.xticks(seq)                         # 设定x轴刻度
plt.plot(seq, Benz, '-*', seq, BMW, '-o', seq, Lexus, '-^')   
plt.title("Sales Report", fontsize=24)
plt.xlabel("Year", fontsize=14)
plt.ylabel("Number of Sales", fontsize=14)
plt.tick_params(axis='both', labelsize=12, color='red')
plt.show()

图例legend()

plot.plot()时需同时设置label。参数loc可以设置图例的位置。

'best':0

'upper right':1

'upper left‘:2

'lower left’:3

'lower right‘:4

'right':5(与'center right'相同)

'Center':6

'center right':7

'lower center‘:8

'upper center’:9

‘center':10

代码如下:

import matplotlib.pyplot as plt

Benz = [3367, 4120, 5539]               # Benz线条
BMW = [4000, 3590, 4423]                # BMW线条
Lexus = [5200, 4930, 5350]              # Lexus线条

seq = [2021, 2022, 2023]                # 年度
plt.xticks(seq)                         # 设定x轴刻度
plt.plot(seq, Benz, '-*', label='Benz')
plt.plot(seq, BMW, '-o', label='BMW')
plt.plot(seq, Lexus, '-^', label='Lexus')
plt.legend(loc='best')
plt.title("Sales Report", fontsize=24)
plt.xlabel("Year", fontsize=14)
plt.ylabel("Number of Sales", fontsize=14)
plt.tick_params(axis='both', labelsize=12, color='red')
plt.show()

运行结果如下:

保存与开启文件

图表设计完成,可以使用savefig()保存文件,这 个方法需放在show()的前方,表示 先储存再显示图表。

代码如下:

import matplotlib.pyplot as plt

Benz = [3367, 4120, 5539]               # Benz线条
BMW = [4000, 3590, 4423]                # BMW线条
Lexus = [5200, 4930, 5350]              # Lexus线条

seq = [2021, 2022, 2023]                # 年度
plt.xticks(seq)                         # 设定x轴刻度
plt.plot(seq, Benz, '-*', label='Benz')
plt.plot(seq, BMW, '-o', label='BMW')
plt.plot(seq, Lexus, '-^', label='Lexus')
plt.legend(loc='best')
plt.title("Sales Report", fontsize=24)
plt.xlabel("Year", fontsize=14)
plt.ylabel("Number of Sales", fontsize=14)
plt.tick_params(axis='both', labelsize=12, color='red')
plt.savefig('out1_14.jpg', bbox_inches='tight')
plt.show()

plt.savefig()中第一个参数是所存的文件名,第二个参数是将图表外多余的空间删除。

要开启文件可以使用matplotlib.image模块。

代码如下:

import matplotlib.pyplot as plt
import matplotlib.image as img

fig = img.imread('out1_14.jpg')
plt.imshow(fig)
plt.show()

在图上标记文件

在绘制图表过程中,有时需要在图上标记文字,这时可以使用text()函数,此函数基本格式如下:

text(x,y,'文件符串')

x,y是文字输出的左下角坐标,它不是绝对坐标,是相对坐标,大小会随着坐标刻度增减。

代码如下:

import matplotlib.pyplot as plt
                                
squares = [0, 1, 4, 9, 16, 25, 36, 49, 64]
plt.plot(squares)           # 列表squares数据是y轴的值
plt.axis([0, 8, 0, 70])     # x轴刻度0-8, y轴刻度0-70
plt.text(2, 30, 'Deepen your mind')
plt.grid()
plt.show()

运行结果:

绘制散点图scatter()

基本散点图的绘制

绘制散点图可以使用scatter(),基本语法如下:

scatter(x, y, s, c, cmap)

x,y:在(x,y)位置绘图                                        c:颜色

s:绘图点的大小,预设是20。                        cmap:彩色图表

在坐标轴(5,5)绘制一个点。

import matplotlib.pyplot as plt

plt.scatter(5, 5)
plt.show()

运行结果:

绘制系列点

代码如下:

import matplotlib.pyplot as plt

xpt = [1,2,3,4,5]
ypt = [1,4,9,16,25]
plt.scatter(xpt, ypt)
plt.show()

运行结果如下:

绘制黄色的系列点,这个系列点有100点,x轴的点由rang(1,100)产生,相对应y轴的值 则是x的平方值 。

代码如下:

import matplotlib.pyplot as plt

xpt = list(range(1,101))        # 建立1-100序列x坐标点
ypt = [x**2 for x in xpt]       # 以x平方方式建立y坐标点
plt.scatter(xpt, ypt, color='y')
plt.show()

运行结果如下:

设定绘图区间

使用axis()设定绘图区间,语法格式如下:

axis([xmin, xmax, ymin, ymax])        #分别 代表x轴和y轴的最小和最大的区间

设定绘图区间为[0,100,0,10000]的应用。

import matplotlib.pyplot as plt

xpt = list(range(1,101))                # 建立1-100序列x坐标点
ypt = [x**2 for x in xpt]               # 以x平方方式建立y坐标点
plt.axis([0, 100, 0, 10000])            # 留意参数是列表
plt.scatter(xpt, ypt, color=(0, 1, 0))  # 绿色
plt.show()

运行结果如下:

numpy模块

numpy是Python的一个扩充模块,可以支持多维度空间的数组与矩阵运算。

导入numpy模块,如下所示:

import numpy as np

建立一个简单的数组linspace()和arange()

在numpy模块中最基本的就是linspace()方法,使用它可以方便地产生等矩的数组,它的语法如下:

linspace(start,end,num)

start是起始值,end是结束值,num是设定产生多少个等距点的数组值,num的默认值是50。

arange()的语法如下:

arange(start, stop, step)

start是起始值,如果省略默认值是0。stop是结束值,但是所产生的数组不包含此值。step是数组相邻元素的间距,如果省略默认值是1。

建立0,1,……,9,10的数组。

import numpy as np

x1 = np.linspace(0, 10, num=11)     # 使用linspace()产生数组
print(type(x1), x1)
x2 = np.arange(0,11,1)              # 使用arange()产生数组
print(type(x2), x2)
x3 = np.arange(11)                  # 简化语法产生数组
print(type(x3), x3)

运行结果如下:

[Running] python -u "c:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\tempCodeRunnerFile.py"
<class 'numpy.ndarray'> [ 0.  1.  2.  3.  4.  5.  6.  7.  8.  9. 10.]
<class 'numpy.ndarray'> [ 0  1  2  3  4  5  6  7  8  9 10]
<class 'numpy.ndarray'> [ 0  1  2  3  4  5  6  7  8  9 10]

[Done] exited with code=0 in 2.785 seconds

绘制波形

单纯给点为可以使用scatter()方法,此方法使用格式如下:

scatter(x, y, market='.',c(或color)='颜色')        #market如果省略会使用预设

绘制sin()和con()的波形,调用plt.scatter()方法2次,相当于绘制2次波形图表。

import matplotlib.pyplot as plt
import numpy as np

xpt = np.linspace(0, 10, 500)           # 建立含500个元素的数组
ypt1 = np.sin(xpt)                      # y数组的变化
ypt2 = np.cos(xpt)
plt.scatter(xpt, ypt1, color=(0, 1, 0)) # 绿色
plt.scatter(xpt, ypt2)                  # 预设颜色
plt.show()

运行结果如下:

使用系统默认颜色,绘制不同波形的应用。

import matplotlib.pyplot as plt
import numpy as np

left = -2 * np.pi
right = 2 * np.pi
x = np.linspace(left, right, 100)

f1 = 2 * np.sin(x)                  # y数组的变化
f2 = np.sin(2*x)
f3 = 0.5 * np.sin(x)

plt.plot(x, f1) 
plt.plot(x, f2)
plt.plot(x, f3)
plt.show()

运行结果如下:

建立不等宽度的散点图

代码如下:

import matplotlib.pyplot as plt
import numpy as np

xpt = np.linspace(0, 5, 500)                        # 建立含500个元素的数组
ypt = 1 - 0.5*np.abs(xpt-2)                         # y数组的变化
lwidths = (1+xpt)**2                                # 宽度数组  
plt.scatter(xpt, ypt, s=lwidths, color=(0, 1, 0))   # 绿色
plt.show()

运行结果如下:

填满区间

在绘制波形时,如要填满区间,此时可以使用matplotlib模块的fill_between()方法,基本语法如下:

fill_bwtween(x,y1,y2,color,alpha,options, ...)        #options是其他设置。

上述会填满所有相对x轴数列y1至y2的区间,如果不指定填满颜色,则会使用预设的线条颜色填满,通常填满颜色 会用较淡的颜色,所以可以设置alpha参数将颜色调谈

填满区间0~y,所使用的y轴值是函数式sin(3x)。

import matplotlib.pyplot as plt
import numpy as np

left = -np.pi
right = np.pi
x = np.linspace(left, right, 100)
y = np.sin(3*x)                  # y数组的变化

plt.plot(x, y) 
plt.fill_between(x, 0, y, color='green', alpha=0.1)
plt.show()

运行结果如下:

填满区间-1~y,所使用的y轴值是函数式sin(3x)。

import matplotlib.pyplot as plt
import numpy as np

left = -np.pi
right = np.pi
x = np.linspace(left, right, 100)
y = np.sin(3*x)                  # y数组的变化

plt.plot(x, y) 
plt.fill_between(x, -1, y, color='yellow', alpha=0.3)
plt.show()

运行结果如下:

色彩映射

camp,color map,指定使用哪一种色彩映射值。

色彩映射的应用。

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(100)
y = x
t = x
plt.scatter(x, y, c=t, cmap='rainbow')
plt.show()

运行结果:

 设置固定点的宽度为50,将色彩改为依y轴值变化,同时使用hsv色彩映射表。

import matplotlib.pyplot as plt
import numpy as np

xpt = np.linspace(0, 5, 500)                            # 建立含500个元素的数组
ypt = 1 - 0.5*np.abs(xpt-2)                             # y数组的变化
  
plt.scatter(xpt, ypt, s=50, c=ypt, cmap='hsv')          # 色彩随y轴值变化
plt.show()

运行结果:

 

将色彩改为依x轴值变化

import matplotlib.pyplot as plt
import numpy as np

xpt = np.linspace(0, 5, 500)                            # 建立含500个元素的数组
ypt = 1 - 0.5*np.abs(xpt-2)                             # y数组的变化
 
plt.scatter(xpt, ypt, s=50, c=xpt, cmap='hsv')          # 色彩随x轴值变化
plt.show()

运行结果:

colormap绘制数组数据。

imshow(img. cmap='xx')

参数img可以图片,也可以数组数据。

绘制矩形数组数据。

import matplotlib.pyplot as plt
import numpy as np

img = np.array([[0, 1, 2, 3],
                [4, 5, 6, 7],
                [8, 9 , 10, 11],
                [12, 13, 14, 15]])
                
plt.imshow(img, cmap='Blues')
plt.colorbar()
plt.show()

运行结果: 

 

图表显示中文

以中文显示报表:

import matplotlib.pyplot as plt
from pylab import mpl

mpl.rcParams["font.sans-serif"] = ["SimHei"]        # 使用黑体

Benz = [3367, 4120, 5539]               # Benz线条
BMW = [4000, 3590, 4423]                # BMW线条
Lexus = [5200, 4930, 5350]              # Lexus线条

seq = [2021, 2022, 2023]                # 年度
plt.xticks(seq)                         # 设定x轴刻度
plt.plot(seq, Benz, '-*', label='Benz')
plt.plot(seq, BMW, '-o', label='BMW')
plt.plot(seq, Lexus, '-^', label='Lexus')
plt.legend(loc='best')
plt.title(u"销售报表", fontsize=24)
plt.xlabel(u"年度", fontsize=14)
plt.ylabel(u"销售量", fontsize=14)
plt.tick_params(axis='both', labelsize=12, color='red')
plt.show()

运行结果如下:

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值