2

大きなファイルからいくつかのデータをプロットしようとしています。データの形式は次のとおりです。

0.025876 139 0
0.030881 140 0
0.030982 141 0
0.035602 142 0
0.035521 143 0
0.038479 144 0
0.040668 145 0
0.040121 146 0
0.037953 147 0
0.039027 148 0
0.038338 149 0
0.047557 139 1
0.045105 140 1
0.044943 141 1
0.042370 142 1
0.042025 143 1
0.038946 144 1
0.037953 145 1
0.033373 146 1
0.030070 147 1
0.029118 148 1
0.025552 149 1 

原則として、各線は3次元の点に対応しており、これらの点から生成された3Dサーフェスを、gnuplotのsplot関数で実行できるのと同じようにプロットしたいと思います。

私の問題に対する答えを見つけるためにネットに行って、私はmatplolib等高線関数で次のことを試みました:

#!/usr/bin/python

from numpy import *
import pylab as p
import sys
import mpl_toolkits.mplot3d.axes3d as p3

 s = str(sys.argv[1])
 f = open(s)
 z,y,x = loadtxt(f, unpack = True)
 f.close
 #x = [1,2,3]
 #y = [1,2,3]
 #z = [1,8,16]
 data = zip(x,y,z)

 #map data on the plane
 X, Y = meshgrid(arange(0, 89, 1), arange(0, 300, 1))
 Z = zeros((len(X),len(Y)),'Float32')
 for x_,y_,z_ in data:
   Z[x_, y_] = z_ #this should work, but only because x and y are integers
             #and arange was done with a step of 1, starting from 0

 fig=p.figure()
 ax = p3.Axes3D(fig)
 ax.contourf(X,Y,Z)
 ax.set_xlabel('X')
 ax.set_ylabel('Y')
 ax.set_zlabel('Z')
 p.show()

このコードは、上記のコードのハッシュタグでコメント化されたベクトルx、y、zで実際に正常に機能しました。

しかし、上記のデータを試していると、matplotlibで「入力xとyは1Dまたは2Dである必要があります」というエラーが発生します。

これは、ZがXまたはYと同じ形状ではないという事実に関連している可能性があることを読みました...しかし、この問題に対処する方法がわかりません。

ちなみに、おそらくお気づきかもしれませんが、私はPythonの初心者であり、コードが非常に醜いように見える場合はお詫び申し上げます。

いずれにせよ、どんな助けでも大歓迎です。

ありがとう !

ファビアン

4

1 に答える 1

1

scipy.interpolate.griddata の使用:

import io
import sys
import numpy as np
import matplotlib.pyplot as plt
import mpl_toolkits.mplot3d.axes3d as axes3d
import scipy.interpolate as interpolate

content = '''0.025876 139 0
0.030881 140 0
0.030982 141 0
0.035602 142 0
0.035521 143 0
0.038479 144 0
0.040668 145 0
0.040121 146 0
0.037953 147 0
0.039027 148 0
0.038338 149 0
0.047557 139 1
0.045105 140 1
0.044943 141 1
0.042370 142 1
0.042025 143 1
0.038946 144 1
0.037953 145 1
0.033373 146 1
0.030070 147 1
0.029118 148 1
0.025552 149 1'''

data = np.genfromtxt(io.BytesIO(content), dtype=None, names='x, y, z')

# Or, to read from a file:
# data = np.genfromtxt(filename, dtype=None, names='x, y, z')

x, y, z = data['x'], data['y'], data['z']
N = 20
xi = np.linspace(x.min(), x.max(), N)
yi = np.linspace(y.min(), y.max(), N)

X, Y = np.meshgrid(xi, yi)
Z = interpolate.griddata((x, y), z, (X, Y), method='nearest')

fig = plt.figure()
ax = fig.add_subplot(1, 1, 1, projection='3d')
ax.scatter(data['x'], data['y'], data['z'])
ax.plot_wireframe(X, Y, Z, rstride=1, cstride=1)
# ax.plot_surface(X, Y, Z)
plt.show()

収量

ここに画像の説明を入力


関連リンク:

于 2013-03-23T13:40:29.880 に答える