7

パターンを見つけることを望んで、3D で表現しようとしている大量のデータがあります。私は読書、調査、コーディングにかなりの時間を費やしましたが、主な問題はプログラミングではなく、実際にデータを視覚化する方法を選択することであることに気付きました。

Matplotlib の mplot3d は多くのオプション (ワイヤーフレーム、輪郭、塗りつぶされた輪郭など) を提供し、MayaVi も同様です。しかし、非常に多くの選択肢があり (そしてそれぞれに独自の学習曲線があります)、私は事実上迷っており、どこから始めればよいかわかりません! だから私の質問は、基本的に、このデータを処理する必要がある場合、どのプロット方法を使用しますか?

私のデータは日付ベースです。各時点について、値 (リスト「実際」) をプロットします。

しかし、各時点には、上限、下限、および中間点もあります。これらの制限と中間点は、異なる平面のシードに基づいています。

「実際の」読み取り値に大きな変化が発生したとき、または発生する前に、ポイントを特定するか、パターンを特定したいと考えています。すべての面の上限が一致したときですか?それともお互いに近づきますか?実際の値が上限/中/下限に達したときですか? ある面のアッパーが別の面のロワーに触れたときですか?

貼り付けているコードでは、データ セットをいくつかの要素に減らしています。私は単純な散布図と折れ線グラフを使用していますが、データ セットのサイズ (およびおそらく mplot3d の制限) のため、探している傾向を見つけるためにそれを使用することはできません。

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

このプロットを取得していますが、相互関係を確認するのに役立ちません.

ここに画像の説明を入力 私は数学者でも科学者でもないので、本当に必要なのは、データを視覚化するための FORMAT を選択することです。これを mplot3d で表示する効果的な方法はありますか? それとも、MayaVis を使用しますか? どちらの場合でも、どのライブラリとクラスを使用しますか?

前もって感謝します。

4

2 に答える 2

7

質問の視覚化部分(プログラミングではない)についてコメントするために、ファセットグラフの例をいくつかモックアップして、データの探索に使用できる代替案を提案しました。

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

最初の例では、細い青い線は、各z軸の3つのレベルすべてに重ねられた実際の値です。

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

折れ線グラフ

2番目のセットでは、各パネルに、各z軸の3つのレベル(上、中、低)に対する実際の値の散布図があります。

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

相関

于 2012-05-26T15:23:06.630 に答える
2

ありがとう、ガウデン。R は実際には私の研究の一部であり、インストールはしましたが、チュートリアルでは十分ではありませんでした。StackOverFlow の規則に反しない限り、あなたの R コードを見ていただければ幸いです。

私はすでに 2D 表現を試しましたが、多くの場合、Tops1/Tops2/Tops3 (および Lows も同様) の値は等しいため、線が重なり合ってお互いを覆い隠してしまいます。これが、3D オプションを試している理由です。2D グラフの 3 つのパネルというあなたのアイデアは、私が検討していなかった素晴らしい提案です。

試してみますが、3D プロット、特に値が収束していることを示すワイヤーフレーム/メッシュ プロットがより鮮明な画像を提供すると考えていたでしょう。ワイヤーフレームの線が山または谷を作り始めます。私はそれを機能させることができません。

私はmatplotlibのワイヤーフレームの例を適応させようとしましたが、私が得ているプロットはワイヤーフレームのようには見えません.

これは、ここに画像の説明を入力2 つのデータ要素 (Tops1 と Tops2) のみを使用して、以下のコードから取得したものです。

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()
于 2012-05-27T12:02:22.040 に答える