Trazado de puntos de datos 3-tupla en una superficie / gráfico de contorno usando matplotlib

StackOverflow https://stackoverflow.com/questions/3012783

  •  26-09-2019
  •  | 
  •  

Pregunta

I tiene algunos datos de superficie que se genera por un programa externo como valores XYZ. Quiero crear los gráficos siguientes, utilizando matplotlib:

  • Diagrama de superficie
  • Gráfico de contorno
  • Trazado del contorno cubrió con una parcela de superficie

He mirado en varios ejemplos para el trazado de las superficies y contornos en matplotlib -. Sin embargo, los valores Z parece ser una función de X e Y es decir, Y ~ f (X, Y)

supongo que de alguna manera voy a necesitar para transformar mis variables Y, pero no he visto ningún ejemplo sin embargo, que muestra cómo hacer esto.

Por lo tanto, mi pregunta es la siguiente: dado un conjunto de (X, Y, Z) puntos, ¿en qué puedo generar superficies y perfiles parcelas de que los datos

Por cierto, sólo para aclarar, yo no quiero crear gráficos de dispersión. También aunque he mencionado matplotlib en el título, no estoy en contra de usar RPY (2), si eso va a permitir a mí para crear estos gráficos.

¿Fue útil?

Solución

para hacer una gráfico de contorno usted necesita interpolar los datos en una cuadrícula regular http://www.scipy.org/Cookbook/Matplotlib/Gridding_irregularly_spaced_data

un ejemplo rápido:

>>> xi = linspace(min(X), max(X))
>>> yi = linspace(min(Y), max(Y))
>>> zi = griddata(X, Y, Z, xi, yi)
>>> contour(xi, yi, zi)

para la superficie http: //matplotlib.sourceforge. net / ejemplos / mplot3d / surface3d_demo.html

>>> from mpl_toolkits.mplot3d import Axes3D
>>> fig = figure()
>>> ax = Axes3D(fig)
>>> xim, yim = meshgrid(xi, yi)
>>> ax.plot_surface(xim, yim, zi)
>>> show()

>>> help(meshgrid(x, y))
    Return coordinate matrices from two coordinate vectors.
    [...]
    Examples
    --------
    >>> X, Y = np.meshgrid([1,2,3], [4,5,6,7])
    >>> X
    array([[1, 2, 3],
           [1, 2, 3],
           [1, 2, 3],
           [1, 2, 3]])
    >>> Y
    array([[4, 4, 4],
           [5, 5, 5],
           [6, 6, 6],
           [7, 7, 7]])

contorno en 3D http: //matplotlib.sourceforge. net / ejemplos / mplot3d / contour3d_demo.html

>>> fig = figure()
>>> ax = Axes3D(fig)
>>> ax.contour(xi, yi, zi) # ax.contourf for filled contours
>>> show()

Otros consejos

Con pandas y numpy para importar y manipular datos, con matplot.pylot.contourf para trazar la imagen

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.mlab import griddata

PATH='/YOUR/CSV/FILE'
df=pd.read_csv(PATH)

#Get the original data
x=df['COLUMNNE']
y=df['COLUMNTWO']
z=df['COLUMNTHREE']

#Through the unstructured data get the structured data by interpolation
xi = np.linspace(x.min()-1, x.max()+1, 100)
yi = np.linspace(y.min()-1, y.max()+1, 100)
zi = griddata(x, y, z, xi, yi, interp='linear')

#Plot the contour mapping and edit the parameter setting according to your data (http://matplotlib.org/api/pyplot_api.html?highlight=contourf#matplotlib.pyplot.contourf)
CS = plt.contourf(xi, yi, zi, 5, levels=[0,50,100,1000],colors=['b','y','r'],vmax=abs(zi).max(), vmin=-abs(zi).max())
plt.colorbar()

#Save the mapping and save the image
plt.savefig('/PATH/OF/IMAGE.png')
plt.show()

Ejemplo Image

Gráfico de contorno con rpy2 + ggplot2:

from rpy2.robjects.lib.ggplot2 import ggplot, aes_string, geom_contour
from rpy2.robjects.vectors import DataFrame

# Assume that data are in a .csv file with three columns X,Y,and Z
# read data from the file
dataf = DataFrame.from_csv('mydata.csv')

p = ggplot(dataf) + \
    geom_contour(aes_string(x = 'X', y = 'Y', z = 'Z'))
p.plot()

parcela de superficie con rpy2 + celosía:

from rpy2.robjects.packages import importr
from rpy2.robjects.vectors import DataFrame
from rpy2.robjects import Formula

lattice = importr('lattice')
rprint = robjects.globalenv.get("print")

# Assume that data are in a .csv file with three columns X,Y,and Z
# read data from the file
dataf = DataFrame.from_csv('mydata.csv')

p = lattice.wireframe(Formula('Z ~ X * Y'), shade = True, data = dataf)
rprint(p)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top