如何制作一个3D散点图

135

我目前有一个nx3的矩阵数组。我想把这三列作为三个轴来绘制图形。 我该怎么做呢?

我已经搜索过了,人们建议使用Matlab,但我真的很难理解它。我还需要它是一个散点图。


1
你是在寻找一个可以绘制图表的应用程序,还是想要编写绘制图表的代码(使用任何编程语言)? - Nils Pipenbrinck
使用Asymptote - 它是免费的,功能强大,质量非常棒! - Hamish Grubijan
1
如果你有一个数组,我会假设你有一个程序,而这个数组是其中的一部分。请告诉我们这个程序是什么类型(语言),给我们提供帮助的机会! - Carl Smotricz
我仍然会使用asymptote(作为库),或者只是为其生成输入文件。看看它惊人的输出质量! - Hamish Grubijan
2
如果是一个 n 行 3 列的数组,您将得到一个三维曲线的图形。对于“三维图形”,您需要一个 n x m x l 的数组。您想要一条曲线,其中任何一个元组 (x,y,z) 都代表曲线上的一个点吗? - Alok Singhal
4个回答

224
你可以使用matplotlib来完成这个任务。Matplotlib有一个mplot3d模块,可以完全满足你的需求。
import matplotlib.pyplot as plt
import random

fig = plt.figure(figsize=(12, 12))
ax = fig.add_subplot(projection='3d')

sequence_containing_x_vals = list(range(0, 100))
sequence_containing_y_vals = list(range(0, 100))
sequence_containing_z_vals = list(range(0, 100))

random.shuffle(sequence_containing_x_vals)
random.shuffle(sequence_containing_y_vals)
random.shuffle(sequence_containing_z_vals)

ax.scatter(sequence_containing_x_vals, sequence_containing_y_vals, sequence_containing_z_vals)
plt.show()

上面的代码会生成如下图所示的图形:

enter image description here


15
不错的解决方案。请注意,plt.zlabel('zlabel') 不起作用。要为 z 轴添加标签,需要使用:ax.set_zlabel('Z') - Yonatan Simson
2
应该是从matplotlib.pyplot导入,而不是导出。 - roktim
1
@roktim 不错的发现。之前的编辑在格式上犯了这个错误,我已经纠正过来了。 - rayryeng
1
这正是我一直在寻找的,谢谢!另外,我还想让我的3D散点图旋转(我需要一个gif),并找到了这篇博客文章,它描述了如何使用你提供的解决方案实现此目标。 - S.Chauhan

15

使用以下代码,它对我有效:

# Create the figure
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

# Generate the values
x_vals = X_iso[:, 0:1]
y_vals = X_iso[:, 1:2]
z_vals = X_iso[:, 2:3]

# Plot the values
ax.scatter(x_vals, y_vals, z_vals, c = 'b', marker='o')
ax.set_xlabel('X-axis')
ax.set_ylabel('Y-axis')
ax.set_zlabel('Z-axis')

plt.show()

当X_iso是我的三维数组时,我从该数组中复制/使用了一个列/轴,并分别分配给了那些变量/数组X_vals、Y_vals、Z_vals。


7
from mpl_toolkits import mplot3d
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
ax = plt.axes(projection='3d')

散点图

zdata = 15 * np.random.random(100)
xdata = np.sin(zdata) + 0.1 * np.random.randn(100)
ydata = np.cos(zdata) + 0.1 * np.random.randn(100)
ax.scatter3D(xdata, ydata, zdata);

在这里输入图片描述

Colab笔记本


1
使用plotly-最简单、功能最强大且效果最好的绘图方式。
import plotly.express as px
df = px.data.iris()
fig = px.scatter_3d(df, x='sepal_length', y='sepal_width', z='petal_width',
              color='species')
fig.show()

https://plotly.com/python/3d-scatter-plots/


2
如果你只需要一个3D图,那么plotly是最简单和最干净的解决方案。 - S.Chauhan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接