4

3D散布図があり、その平面の1つに、日付ごとに2つの点をプロットします。点のペアごとに線を引く方法を聞いてみたところ、ありがたい答えが返ってきました。私が今欲しいのは、単なる線ではなく、ポイントを接続するためにBARまたはRECTANGLEを描画することです。

現時点でのプロットは次のようになりますが、バーが軸に固定されているのではなく「フローティング」になっていることを除けば、matplolibのドキュメントの3Dバーデモのプロットに少し似ているようにしたいと思います。

Axes3D.bar(matplotlibページで説明されているように)使用してみましたが、実際の2つの座標ではなく、各バーに「高さ」を指定する必要があり、その高さは軸に固定されます。

これはコードであり、どんな助けでもありがたいです。

import matplotlib.pyplot
from mpl_toolkits.mplot3d import Axes3D

dates       = [20020514, 20020515, 20020516, 20020517, 20020520]
highs       = [1135, 1158, 1152, 1158, 1163]
lows        = [1257, 1253, 1259, 1264, 1252]
upperLimits = [1125.0, 1125.0, 1093.75, 1125.0, 1125.0]
lowerLimits = [1250.0, 1250.0, 1156.25, 1250.0, 1250.0]

zaxisvalues0= [0, 0, 0, 0, 0]
zaxisvalues1= [1, 1, 1, 1, 1]
zaxisvalues2= [2, 2, 2, 2, 2]

fig = matplotlib.pyplot.figure()
ax  = fig.add_subplot(111, projection = '3d')

ax.plot(dates, zaxisvalues1, lowerLimits, color = 'b')
ax.plot(dates, zaxisvalues2, upperLimits, color = 'r')

for i,j,k,h in zip(dates,zaxisvalues0,lows,highs):
    ax.plot([i,i],[j,j],[k,h],color = 'g')

ax.scatter(dates, zaxisvalues0, highs, color = 'g', marker = "o")
ax.scatter(dates, zaxisvalues0, lows, color = 'y', marker = "^")

matplotlib.pyplot.show()
4

3 に答える 3

5

PolyCollection を使用する方が簡単だと思います。これはあなたが求めているものに近いですか?

ここに画像の説明を入力

import matplotlib.pyplot
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.collections import PolyCollection
import random

dates       = [20020514, 20020515, 20020516, 20020517, 20020520]
highs       = [1135, 1158, 1152, 1158, 1163]
lows        = [1257, 1253, 1259, 1264, 1252]
upperLimits = [1125.0, 1125.0, 1093.75, 1125.0, 1125.0]
lowerLimits = [1250.0, 1250.0, 1156.25, 1250.0, 1250.0]

zaxisvalues0= [0, 0, 0, 0, 0]
zaxisvalues1= [1, 1, 1, 1, 1]
zaxisvalues2= [2, 2, 2, 2, 2]

fig = matplotlib.pyplot.figure()
ax  = fig.add_subplot(111, projection = '3d')

ax.plot(dates, zaxisvalues1, lowerLimits, color = 'b')
ax.plot(dates, zaxisvalues2, upperLimits, color = 'r')

verts = []; fcs = []
for i in range(len(dates)-1):
   xs = [dates[i],dates[i+1],dates[i+1],dates[i],dates[i]] # each box has 4 vertices, give it 5 to close it, these are the x coordinates
   ys = [highs[i],highs[i+1],lows[i+1],lows[i], highs[i]]  # each box has 4 vertices, give it 5 to close it, these are the y coordinates
   verts.append(zip(xs,ys))
   fcs.append((random.random(),random.random(),random.random(),0.6))

poly = PolyCollection(verts, facecolors = fcs, closed = False)
ax.add_collection3d(poly, zs=[zaxisvalues0[0]] * len(verts), zdir='y') # in the "z" just use the same coordinate

ax.scatter(dates, zaxisvalues0, highs, color = 'g', marker = "o")
ax.scatter(dates, zaxisvalues0, lows, color = 'y', marker = "^")

matplotlib.pyplot.show()
于 2012-05-15T14:23:24.980 に答える
2

アレクシスとマークを助けてくれてありがとう。今は整理されていると思います。

「zdir」プロパティを使用するための Alexis のヒントを使用しました。

間違った平面の問題については、パラメーター zdir で修正できます。たとえば、ax.bar(dates, highs,zdir='y',bottom=highs, zs=0, color = 'b') – アレクシス

最初は、下から (つまり「安値」の値) 測定し、次に高さ (「高値」の値) を追加していたため、実際の 2 倍の高さのバーを生成していました。

そこで、高値と安値の間の距離を測定する新しいリスト「変位」を導入することになりました (そして、その過程で、安値と高値が入れ替わっていることに気付きました。それは申し訳ありません)。だから今、私は高値ではなく「変位」をプロットしています。

アレクシスの行に、幅、配置、エッジカラー、アルファ (透明度用) を追加しました。次に、ax.scatter プロットのマーカーを太くしました。これでコードは機能します (ほぼ、4 番目のバーの矢印が本来よりも高いことを除いて... うーん)

import matplotlib.pyplot
from mpl_toolkits.mplot3d import Axes3D

dates       = [20020514, 20020515, 20020516, 20020517, 20020520]
lows        = [1135, 1158, 1152, 1158, 1163]
highs       = [1257, 1253, 1259, 1264, 1252]
upperLimits = [1125.0, 1125.0, 1093.75, 1125.0, 1125.0]
lowerLimits = [1250.0, 1250.0, 1156.25, 1250.0, 1250.0]

zaxisvalues0= [0, 0, 0, 0, 0]
zaxisvalues1= [1, 1, 1, 1, 1]
zaxisvalues2= [2, 2, 2, 2, 2]

fig = matplotlib.pyplot.figure()
ax  = fig.add_subplot(111, projection = '3d')

ax.plot(dates, zaxisvalues1, lowerLimits, color = 'b')
ax.plot(dates, zaxisvalues2, upperLimits, color = 'r')

ax.scatter(dates, zaxisvalues0, highs, color = 'g', marker = "^", linewidth=4)
ax.scatter(dates, zaxisvalues0, lows,  color = 'y', marker = "o", linewidth=4)

displacements = []
for i in lows:
    position = lows.index(i)
    disp = highs[position] - i
    displacements.append(disp)

ax.bar(dates, displacements, zdir='y', bottom=lows, zs=0, width=0.2, align='center', alpha=0.6, edgecolor='k')

matplotlib.pyplot.show()

結果は次のとおりです。

プロット

于 2012-05-16T10:58:13.693 に答える
2

次のものを組み合わせることができるはずです。

matplolib のドキュメントからの 3D バーのデモ

積み上げ棒グラフの例

つまり、3D グラフでバーを描画しますが、「bottom」パラメーターを使用してバーの開始高さを設定します。

アレクシス

于 2012-05-15T12:44:23.223 に答える