Как получить контурный график и трехмерный график, используя Matplotlib, начиная с набора из 3 столбцов, представляющих точки x, y и z? - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть файл данных, в котором есть 3 столбца, представляющих значения x, y и z. Точки z получены из отношения между x и y (поэтому для каждой пары x [i] y [i] есть az [i]). Я хотел бы, используя Matplotlib, получить контурный график и раскрасить поверхность по значениям z, а затем аналогично трехмерному графику. Во многих примерах я видел, что можно использовать numpy для создания сетки x и y (что я не могу сделать из-за огромного количества данных), а затем определить z как f (x, y), но, как я уже сказал У меня уже есть значения z для х и у. С GnuPlot это довольно просто сделать, но в этом случае я не могу понять, как это происходит. Можете ли вы помочь? Заранее спасибо

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

data=pd.read_csv('data.dat')
x=np.array(data.iloc[:,0])
y=np.array(data.iloc[:,1])
z=np.array(data.iloc[:,2])

contour = plt.tricontour(x, y, z, 20, colors='k', extent=[min(x), max(x), min(y), max(y)], origin='lower', alpha=0.3) #obtain contour plot

plt.imshow(z, extent=[min(x), max(x), min(y), max(y)], origin='lower') #of course here comes the error about the shape of z

1 Ответ

0 голосов
/ 22 апреля 2020

Я решил следующим образом:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D

###read file and set variables##
df=pd.read_csv('file.dat') #with some parameters#
D=df.iloc[:,:3]

x=np.array(D.iloc[:,0])
y=np.array(D.iloc[:,1])
z=np.array(D.iloc[:,2])

cv1=np.array(x[0:len(x):100])
cv2=np.array(y[0:len(y):100])*(180/np.pi)
fes=np.array(z[0:len(z):100])

### set plot ###
m=cm.ScalarMappable(cmap=cm.coolwarm)
m.set_array([min(fes),max(fes)])
m.set_clim(vmin=min(fes),vmax=max(fes))

fig=plt.figure()
surf=plt.axes(projection='3d')
surf.plot_trisurf(cv1,cv2,fes, cmap='coolwarm')

plt.tricontour(cv1,cv2,fes, colors='k', zdir='z', offset=-np.abs(min(z)), alpha=0.3)
plt.tricontourf(cv1,cv2,fes, cmap='coolwarm', zdir='z', offset=-np.abs(min(z)))

###finally set labels, ticks and colorbar###
...