一、摘要
在进行数据可视化时,对于一元函数f(x)=y
数据我们可以使用二维平面图显示,x轴表示自变量,y轴表示函数值;对于二元函数f(x,y)=z
数据我们也可以使用三维图可视化,x和y轴表示自变量,z轴表示函数值。由于显示设备的局限性,对于三元函数f(x,y,z)=v
数据无法通过增加坐标轴的方式可视化,一个可行的方法是使用x、y和z轴表示自变量,使用数据点的颜色表示函数值。
如下图所示:
本文实现了如上图所示的三维散点图,颜色表示数值大小,并增加了可以自定义范围的侧边colorbar。
文章第二部分为实现代码及部分注释,第三部分为对部分代码的详细解释,第四部分为参考的文章链接。
二、代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
import matplotlib.colors import matplotlib.ticker import matplotlib.pyplot as plt import random # 1.0 初始化数据 # f(x,y,z) = v # 其中x,y,z为随机数,v=x*y*z x = [random.randint( 0 , 100 ) for i in range ( 0 , 100 )] y = [random.randint( 0 , 100 ) for i in range ( 0 , 100 )] z = [random.randint( 0 , 100 ) for i in range ( 0 , 100 )] v = [x[i] * y[i] * z[i] for i in range ( 0 , 100 )] # 1.1 根据各个点的值(v[]),设置点的颜色值,每个点的颜色使用一个rgb三维的元组表示,例如,若想让点显示为红色,则颜色值为(1.0,0,0) # 设置各个点的颜色 # 每个点的颜色值按照colormap("seismic",100)进行设计,其中colormap类型为"seismic",共分为100个级别(level) min_v = min (v) max_v = max (v) color = [plt.get_cmap( "seismic" , 100 )( int ( float (i - min_v) / (max_v - min_v) * 100 )) for i in v] # 2.0 显示三维散点图 # 新建一个figure() fig = plt.figure() # 在figure()中增加一个subplot,并且返回axes ax = fig.add_subplot( 111 ,projection = '3d' ) # 设置colormap,与上面提到的类似,使用"seismic"类型的colormap,共100个级别 plt.set_cmap(plt.get_cmap( "seismic" , 100 )) # 绘制三维散点,各个点颜色使用color列表中的值,形状为"." im = ax.scatter(x, y, z, s = 100 ,c = color,marker = '.' ) # 2.1 增加侧边colorbar # 设置侧边colorbar,colorbar上显示的值使用lambda方程设置 fig.colorbar(im, format = matplotlib.ticker.FuncFormatter( lambda x,pos: int (x * (max_v - min_v) + min_v))) # 2.2 增加坐标轴标签 ax.set_xlabel( 'x' ) ax.set_ylabel( 'y' ) ax.set_zlabel( 'z' ) # 2.3显示 plt.show() |
运行结果如下:
三、部分代码解释
1. colormap(颜色)映射设置。
如上图所示,为了通过颜色表示各个点的值需要设定一个合理的值-点颜色映射关系。本文代码中使用"seismic"
colormap,同时设置colormap分为100个level。对应代码为:
1
|
color = [plt.get_cmap( "seismic" , 100 )( int ( float (i - min_v) / (max_v - min_v) * 100 )) for i in v] |
在代码中plt.get_cmap("seismic",100)
会得到一个colormap对象,然后使用plt.get_cmap("seismic",100)(x)
可以得到对应x
级别的颜色代码值。例如:
1
2
3
4
|
a = plt.get_cmap( "seismic" , 100 )( 0 ) b = plt.get_cmap( "seismic" , 100 )( 100 ) print ( "a:" , a) print ( "b:" , b) |
输出结果为:
a: (0.0, 0.0, 0.3, 1.0)
b: (0.5, 0.0, 0.0, 1.0)
表示级别0对应的(r,g,b,alpha)颜色值为(0.0, 0.0, 0.3, 1.0)
,级别100对应的颜色值为(0.5, 0.0, 0.0, 1.0)
。
如果需要使用其他类型的colormap,可以通过设置colormap名得到不同的效果,详细参考文章:python matplotlib自定义colorbar颜色条-以及matplotlib中的内置色条。
2. 设置三维散点格式
通过设置plot格式:
1
|
ax = fig.add_subplot( 111 ,projection = '3d' ) |
再使用scatter()
函数绘制三维散点图:
1
|
im = ax.scatter(x, y, z, s = 100 ,c = color,marker = '.' ) |
其中s=100
为设置点的大小、c=color
为设置点的颜色,marker='.'
为设置点的形状(此处为实心圆点)。
3. 设置侧边colorbar
根据数据的格式,我们需要设置侧边colorbar显示的数值范围,例如,本例中最小值为825
,最大值为784179
。代码中使用lambda表达式计算显示的值,默认显示的值为[0,1]
,因此需要使用lambda公式将显示的值调整到[825,784179]
。代码如下:
1
|
fig.colorbar(im, format = matplotlib.ticker.FuncFormatter( lambda x,pos: int (x * (max_v - min_v) + min_v))) |
另外为了使点的颜色与colorbar颜色对应,需要使用
1
|
plt.set_cmap(plt.get_cmap( "seismic" , 100 )) |
使的clormap
和colorbar
具有同样的类型。
四、参考
[1]. MATLAB scatter 画二维/三维散点图时 用颜色表示数值大小 colorbar
[2]. 三维散点图加colorbar
[3]. 【python图像处理】彩色映射
[4]. matplotlib的colorbar自定义刻度范围
[5]. Python中lambda的使用
总结
到此这篇关于matplotlib之Pyplot模块绘制三维散点图使用颜色表示数值大小的文章就介绍到这了,更多相关Pyplot绘制三维散点图内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://blog.csdn.net/Strengthennn/article/details/120173869