Plot points de données 3-tuple dans une parcelle de surface / contour en utilisant matplotlib

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

  •  26-09-2019
  •  | 
  •  

Question

I ont des données de surface qui est générée par un programme externe en tant que valeurs XYZ. Je veux créer les graphiques suivants, en utilisant matplotlib:

  • Surface parcelle
  • Contour terrain
  • Contour terrain avec un terrain recouvert de surface

nous avons examiné plusieurs exemples pour le tracé des surfaces et des contours dans matplotlib -. Cependant, les valeurs de Z semble être une fonction de X et Y à-dire Y ~ f (X, Y)

Je suppose que je vais devoir en quelque sorte de transformer mes variables Y, mais je ne l'ai pas vu aucun exemple encore, qui montre comment faire.

Alors, ma question est la suivante: étant donné un ensemble de (X, Y, Z) des points, comment puis-je générer des tracés de surface et le contour de ces données

BTW, juste pour clarifier, je ne veux pas créer des diagrammes de dispersion. En outre, bien que je l'ai mentionné matplotlib dans le titre, je ne suis pas opposé à l'utilisation RPY (2), si cela me permettra de créer ces cartes.

Était-ce utile?

La solution

pour faire un tracé de contour vous avez besoin interpoler vos données sur une grille régulière http://www.scipy.org/Cookbook/Matplotlib/Gridding_irregularly_spaced_data

un exemple rapide:

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

pour surface http: //matplotlib.sourceforge. net / examples / 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]])

contour en 3D http: //matplotlib.sourceforge. net / examples / mplot3d / contour3d_demo.html

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

Autres conseils

Avec pandas géants et numpy à importer et manipuler des données, avec matplot.pylot.contourf pour tracer l'image

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()

Exemple d'image

Contour terrain avec 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()

Surface parcelle avec rpy2 + réseau:

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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top