Python 如何在Matplotlib或Mayavi中表示以下三维数据?
我有一大组数据,我正试图用3D来表示,希望找出一个模式。我花了相当长的时间阅读、研究和编码,但后来我意识到我的主要问题不是编程,而是选择一种可视化数据的方法 Matplotlib的mplot3d提供了很多选项(线框、轮廓、填充轮廓等),MayaVi也提供了很多选项。但是有太多的选择(而且每个都有自己的学习曲线),我几乎不知所措,不知道从哪里开始!所以我的问题是,如果你必须处理这些数据,你会使用哪种绘图方法 我的数据是基于日期的。对于每个时间点,我绘制一个值(“实际”列表) 但对于每个时间点,我也有一个上限、一个下限和一个中间点。这些限制和中点基于不同平面中的种子 当我的“实际”阅读发生重大变化时,或之前,我想找出要点或识别模式。是不是所有飞机的上限都达到了?或者彼此接近?实际值是否达到上/中/下限?是一个平面的上部接触另一个平面的下部吗 在我粘贴的代码中,我将数据集简化为几个元素。我只是使用简单的散点图和线图,但由于数据集的大小(可能还有mplot3d的局限性),我无法使用它来发现我正在寻找的趋势Python 如何在Matplotlib或Mayavi中表示以下三维数据?,python,r,matplotlib,mayavi,mplot3d,Python,R,Matplotlib,Mayavi,Mplot3d,我有一大组数据,我正试图用3D来表示,希望找出一个模式。我花了相当长的时间阅读、研究和编码,但后来我意识到我的主要问题不是编程,而是选择一种可视化数据的方法 Matplotlib的mplot3d提供了很多选项(线框、轮廓、填充轮廓等),MayaVi也提供了很多选项。但是有太多的选择(而且每个都有自己的学习曲线),我几乎不知所措,不知道从哪里开始!所以我的问题是,如果你必须处理这些数据,你会使用哪种绘图方法 我的数据是基于日期的。对于每个时间点,我绘制一个值(“实际”列表) 但对于每个时间点,我也
dates = [20110101,20110104,20110105,20110106,20110107,20110108,20110111,20110112]
zAxis0= [ 0, 0, 0, 0, 0, 0, 0, 0]
Actual= [ 1132, 1184, 1177, 950, 1066, 1098, 1116, 1211]
zAxis1= [ 1, 1, 1, 1, 1, 1, 1, 1]
Tops1 = [ 1156, 1250, 1156, 1187, 1187, 1187, 1156, 1156]
Mids1 = [ 1125, 1187, 1125, 1156, 1156, 1156, 1140, 1140]
Lows1 = [ 1093, 1125, 1093, 1125, 1125, 1125, 1125, 1125]
zAxis2= [ 2, 2, 2, 2, 2, 2, 2, 2]
Tops2 = [ 1125, 1125, 1125, 1125, 1125, 1250, 1062, 1250]
Mids2 = [ 1062, 1062, 1062, 1062, 1062, 1125, 1000, 1125]
Lows2 = [ 1000, 1000, 1000, 1000, 1000, 1000, 937, 1000]
zAxis3= [ 3, 3, 3, 3, 3, 3, 3, 3]
Tops3 = [ 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250]
Mids3 = [ 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187]
Lows3 = [ 1125, 1125, 1000, 1125, 1125, 1093, 1093, 1000]
import matplotlib.pyplot
from mpl_toolkits.mplot3d import Axes3D
fig = matplotlib.pyplot.figure()
ax = fig.add_subplot(111, projection = '3d')
#actual values
ax.scatter(dates, zAxis0, Actual, color = 'c', marker = 'o')
#Upper limits, Lower limts, and Mid-range for the FIRST plane
ax.plot(dates, zAxis1, Tops1, color = 'r')
ax.plot(dates, zAxis1, Mids1, color = 'y')
ax.plot(dates, zAxis1, Lows1, color = 'b')
#Upper limits, Lower limts, and Mid-range for the SECOND plane
ax.plot(dates, zAxis2, Tops2, color = 'r')
ax.plot(dates, zAxis2, Mids2, color = 'y')
ax.plot(dates, zAxis2, Lows2, color = 'b')
#Upper limits, Lower limts, and Mid-range for the THIRD plane
ax.plot(dates, zAxis3, Tops3, color = 'r')
ax.plot(dates, zAxis3, Mids3, color = 'y')
ax.plot(dates, zAxis3, Lows3, color = 'b')
#These two lines are just dummy data that plots transparent circles that
#occpuy the "wall" behind my actual plots, so that the last plane appears
#floating in 3D rather than being pasted to the plot's background
zAxis4= [ 4, 4, 4, 4, 4, 4, 4, 4]
ax.scatter(dates, zAxis4, Actual, color = 'w', marker = 'o', alpha=0)
matplotlib.pyplot.show()
我得到了这个情节,但它不能帮助我看到任何合作关系
我不是数学家或科学家,所以我真正需要的是帮助选择可视化数据的格式。有没有一种有效的方法可以在mplot3d中显示这一点?或者你会用玛雅维斯吗?在这两种情况下,您将使用哪个库和类
提前感谢。为了对您问题的可视化部分(而不是编程)进行评论,我模拟了一些分面图示例,以建议您可能希望用于探索数据的备选方案
library("lubridate")
library("ggplot2")
library("reshape2")
dates <- c("2011-01-01","2011-01-04","2011-01-05",
"2011-01-06","2011-01-07","2011-01-08",
"2011-01-11","2011-01-12")
dates <- ymd(dates)
Actual<- c( 1132, 1184, 1177, 950, 1066, 1098, 1116, 1211,
1132, 1184, 1177, 950, 1066, 1098, 1116, 1211,
1132, 1184, 1177, 950, 1066, 1098, 1116, 1211)
z <- c( 1, 1, 1, 1, 1, 1, 1, 1,
2, 2, 2, 2, 2, 2, 2, 2,
3, 3, 3, 3, 3, 3, 3, 3)
Tops <- c( 1156, 1250, 1156, 1187, 1187, 1187, 1156, 1156,
1125, 1125, 1125, 1125, 1125, 1250, 1062, 1250,
1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250)
Mids <- c( 1125, 1187, 1125, 1156, 1156, 1156, 1140, 1140,
1062, 1062, 1062, 1062, 1062, 1125, 1000, 1125,
1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187)
Lows <- c( 1093, 1125, 1093, 1125, 1125, 1125, 1125, 1125,
1000, 1000, 1000, 1000, 1000, 1000, 937, 1000,
1125, 1125, 1000, 1125, 1125, 1093, 1093, 1000)
df <- data.frame( cbind(z, dates, Actual, Tops, Mids, Lows))
dfm <- melt(df, id.vars=c("z", "dates", "Actual"))
库(“lubridate”)
图书馆(“ggplot2”)
图书馆(“重塑2”)
日期谢谢你,高登。R实际上是我研究的一部分,我已经安装了,但在教程中还不够深入。除非违反StackOverFlow规则,否则我很乐意看到你的R代码
我已经尝试过二维表示,但在许多情况下,Tops1/Tops2/Tops3的值(以及类似的LOW值)是相等的,因此线最终会重叠并相互遮挡。这就是为什么我要尝试3D选项。你关于3组2D图形的想法是一个很好的建议,我没有探讨过
我会尝试一下,但我认为3D绘图会给我一个更清晰的画面,特别是线框/网格绘图,它会显示值会聚,我会看到蓝点在3D空间中浮动,在线框上的线开始形成峰值或低谷的点上。我就是不能让它工作
我尝试过改编,但我得到的情节看起来根本不像线框
这是我从下面的代码中得到的,其中只有两个数据元素(Tops1和Tops2):
如果你在寻找相关性,3d可能不是最好的方式。这种观点妨碍了解释。您可能需要使用分面图表、过度绘图和散点绘图。谢谢,gauden。关于第二组(图周围有灰色封套的那一组),这种图在R中被称为什么?您知道Python/matplotlib等价物的名称吗?我一直在看,似乎找不到任何类似的东西。@Zambi我很高兴发布R代码。您可能需要在问题中添加R
标记,以增加可能的答案数量。我不确定第二个情节是否有特定的名称。它是一组由两个变量(z轴和水平)分面的散点图。这条线是一条拟合的曲线,云表示标准误差。这种将数据分解成子集并绘制2D子图网格的方法的一些常见名称是“面”(ggplot[Wickham])或“小倍数”(Tufte)或“条件图”,通常缩写为“Coplot”(lattice/Grillis[Cleveland,Chambers,Sarkar])+1用于实验。我希望其他人也能帮忙,我更喜欢这个问题,看看会发生什么。
p <- ggplot(data = dfm,
aes(x = dates,
y = value,
group = variable,
colour = variable)
) + geom_line(size = 3) +
facet_grid(variable ~ z) +
geom_point(aes(x = dates,
y = Actual),
colour = "steelblue",
size = 3) +
geom_line(aes(x = dates,
y = Actual),
colour = "steelblue",
size = 1) +
theme_bw()
p
p <- ggplot(data = dfm,
aes(x = Actual,
y = value,
group = variable,
colour = variable)
) + geom_point(size = 3) +
geom_smooth() +
facet_grid(variable ~ z) +
theme_bw()
p
dates = [20110101,20110104,20110105,20110106,20110107,20110108,20110111,20110112]
zAxis0= [ 0, 0, 0, 0, 0, 0, 0, 0]
Actual= [ 1132, 1184, 1177, 950, 1066, 1098, 1116, 1211]
zAxis1= [ 1, 1, 1, 1, 1, 1, 1, 1]
Tops1 = [ 1156, 1250, 1156, 1187, 1187, 1187, 1156, 1156]
Mids1 = [ 1125, 1187, 1125, 1156, 1156, 1156, 1140, 1140]
Lows1 = [ 1093, 1125, 1093, 1125, 1125, 1125, 1125, 1125]
zAxis2= [ 2, 2, 2, 2, 2, 2, 2, 2]
Tops2 = [ 1125, 1125, 1125, 1125, 1125, 1250, 1062, 1250]
Mids2 = [ 1062, 1062, 1062, 1062, 1062, 1125, 1000, 1125]
Lows2 = [ 1000, 1000, 1000, 1000, 1000, 1000, 937, 1000]
zAxis3= [ 3, 3, 3, 3, 3, 3, 3, 3]
Tops3 = [ 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250]
Mids3 = [ 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187]
Lows3 = [ 1125, 1125, 1000, 1125, 1125, 1093, 1093, 1000]
import matplotlib.pyplot
from mpl_toolkits.mplot3d import Axes3D
fig = matplotlib.pyplot.figure()
ax = fig.add_subplot(111, projection = '3d')
####example code from: http://matplotlib.sourceforge.net/mpl_toolkits/mplot3d/tutorial.html#wireframe-plots
#from mpl_toolkits.mplot3d import axes3d
#import matplotlib.pyplot as plt
#import numpy as np
#fig = plt.figure()
#ax = fig.add_subplot(111, projection='3d')
#X, Y, Z = axes3d.get_test_data(0.05)
#ax.plot_wireframe(X, Y, Z, rstride=10, cstride=10)
#plt.show()
X, Y, Z = dates, Tops1, Tops2
ax.plot_wireframe(X, Y, Z, rstride=1, cstride=1, color = 'g')
matplotlib.pyplot.show()