Mathematica で移動平均を使用して 3D ヒストグラムを平滑化しようとしています。私が望むものに近い Smoothhistogram3D という関数があることは知っていますが、分布関数を使用して曲線を滑らかにするオプションしかないようです。このstackoverflowの回答を変更してinterpolationOrderと移動平均機能を含めることで、2Dヒストグラムを平滑化する関数を作成できました。
MovAvgHistoPlot[MovAvg_, dx_] := Module[{histList, transposedHistList, histListAvg},
histList = HistogramList[data, {dx}];
transposedHistList = Transpose[{histList[[1]],ArrayPad[histList[[2]], {0, 1},
"Fixed"]}];
histListAvg = MovingAverage[transposedHistList, MovAvg];
histPlot = ListPlot[histListAvg, InterpolationOrder -> 3, Joined -> True,
AxesOrigin -> {histListAvg[[1, 1]], 0}, PlotRange -> All, InterpolationOrder -> 3,
PlotStyle -> Black, FrameLabel -> {"kTh", "Ion Intensity"},Frame -> {{True, False},
{True, False}}, Axes -> False, ImageSize -> Large]
]
Manipulate[MovAvgHistoPlot[MovAvg, dx], {{MovAvg, 1, "Moving Average"}, 1, 500, 1},
ContinuousAction -> False]
以下のコードを使用して 3 次元に拡張しようとしましたが、成功しませんでした。
MovAvgHistPlot3D[MovAvg_] := Module[{HistList3D, XAndZGroupedValues, XValues, ZValues,
XAndZValues, YValues, ListPlot3DPoints},
HistList3D = HistogramList[data];
XAndZValues = Flatten[Partition[Table[Riffle[HistList3D[[1, 2]],
HistList3D[[1, 1, i]], {1, -1, 2}], {i,Length[HistList3D[[1, 1]]]}], {1, 2}]];
YValues = Flatten[ArrayPad[Map[ArrayPad[##, {0, 1}, "Fixed"] &, HistList3D[[2]]],
{0, 1}, "Fixed"]];
ListPlot3DPoints = Partition[Riffle[XAndZValues, YValues, {3, -1, 3}], 3];
ListPlot3DPointsAvg = MovingAverage[ListPlot3DPoints, MovAvg];
ListPlot3D[ListPlot3DPointsAvg, InterpolationOrder -> 3, Joined -> True]
]
Manipulate[MovAvgHistPlot3D[MovAvg], {{MovAvg, 1, "Moving Average"}, 1, 1000, 1},
ContinuousAction -> False]
ただし、3D 関数は、私のデータ セットを使用してこの画像を出力します: http://imgur.com/MJeBbwW
移動平均を使用して平滑化するオプションを除いて、最初にこれと同様の方法を使用してみました。
ListPlot3D[HistogramList[filteredData1]]
ただし、次のような画像が出力されました。
http://imgur.com/Bkj0R9W
(Sorry, can't post more than two links due to lack of reputation points)
Smoothhistogram3D の出力によく似たデータ セットが必要ですが、移動平均による平滑化のオプションがあります。
http://imgur.com/NRj6V2R
助言がありますか?私が気付いていないより簡単な方法はありますか?
申し訳ありませんが、コード、特に 2 番目の部分がほとんど読めません。私はMathematica が初めてで、それを機能させようとしていました。
また、スタック オーバーフローについて投稿するのはこれが初めてなので、フォーマットやガイドラインの間違いをお許しください。