脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Python - matplotlib之Pyplot模块绘制三维散点图使用颜色表示数值大小

matplotlib之Pyplot模块绘制三维散点图使用颜色表示数值大小

2022-08-10 15:13刘好念 Python

在撰写论文时常常会用到matplotlib来绘制三维散点图,下面这篇文章主要给大家介绍了关于matplotlib之Pyplot模块绘制三维散点图使用颜色表示数值大小的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下

一、摘要

在进行数据可视化时,对于一元函数f(x)=y数据我们可以使用二维平面图显示,x轴表示自变量,y轴表示函数值;对于二元函数f(x,y)=z数据我们也可以使用三维图可视化,x和y轴表示自变量,z轴表示函数值。由于显示设备的局限性,对于三元函数f(x,y,z)=v数据无法通过增加坐标轴的方式可视化,一个可行的方法是使用x、y和z轴表示自变量,使用数据点的颜色表示函数值。

如下图所示:

matplotlib之Pyplot模块绘制三维散点图使用颜色表示数值大小

本文实现了如上图所示的三维散点图,颜色表示数值大小,并增加了可以自定义范围的侧边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()

运行结果如下:

matplotlib之Pyplot模块绘制三维散点图使用颜色表示数值大小

三、部分代码解释

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))

使的clormapcolorbar具有同样的类型。

四、参考

[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

延伸 · 阅读

精彩推荐
  • Python对Python使用mfcc的两种方式详解

    对Python使用mfcc的两种方式详解

    今天小编就为大家分享一篇对Python使用mfcc的两种方式详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    seTaire12822021-05-13
  • Python使用django-crontab实现定时任务的示例

    使用django-crontab实现定时任务的示例

    这篇文章主要介绍了使用django-crontab实现定时任务,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    kongxx11392021-01-18
  • PythonPython实现批量梯度下降法(BGD)拟合曲线

    Python实现批量梯度下降法(BGD)拟合曲线

    这篇文章主要介绍了Python实现批量梯度下降法(BGD)拟合曲线,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的...

    古明地板砖7332021-09-30
  • Pythonpython函数装饰器用法实例详解

    python函数装饰器用法实例详解

    这篇文章主要介绍了python函数装饰器用法,以实例形式较为详细的分析了Python函数装饰器的常见使用技巧,需要的朋友可以参考下 ...

    MaxOmnis2992020-07-12
  • PythonPython爬虫实例之2021猫眼票房字体加密反爬策略(粗略版)

    Python爬虫实例之2021猫眼票房字体加密反爬策略(粗略版)

    这篇文章主要介绍了Python爬虫实例之2021猫眼票房字体加密反爬策略(粗略版),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需...

    绿色恐龙GT10372021-09-08
  • PythonPython中使用copy模块实现列表(list)拷贝

    Python中使用copy模块实现列表(list)拷贝

    这篇文章主要介绍了Python中使用copy模块实现列表(list)拷贝,本文讲解了简单列表的复制和复杂列表复制的解决方法,需要的朋友可以参考下 ...

    脚本之家12152020-06-05
  • Python支持python的分布式计算框架Ray详解

    支持python的分布式计算框架Ray详解

    Ray是一种分布式执行框架,便于大规模应用程序和利用先进的机器学习库,今天给大家分享支持python的分布式计算框架Ray详解,感兴趣的朋友一起看看吧...

    ChanGerry-Johnson11272021-12-16
  • Pythonpython tornado微信开发入门代码

    python tornado微信开发入门代码

    这篇文章主要为大家详细介绍了python tornado微信开发入门代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    LindenTao5312021-03-29