简体   繁体   English

使用 matplotlib 在曲面/等高线图中绘制 3 元组数据点

[英]Plotting 3-tuple data points in a surface / contour plot using matplotlib

I have some surface data that is generated by an external program as XYZ values.我有一些由外部程序生成的表面数据作为 XYZ 值。 I want to create the following graphs, using matplotlib:我想使用 matplotlib 创建以下图形:

  • Surface plot曲面图
  • Contour plot等高线图
  • Contour plot overlayed with a surface plot与曲面图重叠的等高线图

I have looked at several examples for plotting surfaces and contours in matplotlib - however, the Z values seems to be a function of X and Y ie Y ~ f(X,Y).我已经看过几个在 matplotlib 中绘制曲面和轮廓的示例 - 但是,Z 值似乎是 X 和 Y 的函数,即 Y ~ f(X,Y)。

I assume that I will somehow need to transform my Y variables, but I have not seen any example yet, that shows how to do this.我假设我会以某种方式需要转换我的 Y 变量,但我还没有看到任何示例,说明如何做到这一点。

So, my question is this: given a set of (X,Y,Z) points, how may I generate Surface and contour plots from that data?所以,我的问题是:给定一组 (X,Y,Z) 点,我如何从该数据生成曲面和等高线图?

BTW, just to clarify, I do NOT want to create scatter plots.顺便说一句,只是为了澄清,我不想创建散点图。 Also although I mentioned matplotlib in the title, I am not averse to using rpy(2), if that will allow me to create these charts.此外,虽然我在标题中提到了 matplotlib,但我并不反对使用 rpy(2),如果这能让我创建这些图表。

for do a contour plot you need interpolate your data to a regular grid http://www.scipy.org/Cookbook/Matplotlib/Gridding_irregularly_spaced_data绘制等高线图,您需要将数据插入到常规网格http://www.scipy.org/Cookbook/Matplotlib/Gridding_irregularly_spaced_data

a quick example:一个简单的例子:

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

for the surface http://matplotlib.sourceforge.net/examples/mplot3d/surface3d_demo.html对于表面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 in 3D http://matplotlib.sourceforge.net/examples/mplot3d/contour3d_demo.html 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()

With pandas and numpy to import and manipulate data, with matplot.pylot.contourf to plot the image使用 pandas 和 numpy 导入和操作数据,使用 matplot.pylot.contourf 绘制图像

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

Example Image示例图像

Contour plot with rpy2 + ggplot2:使用 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 plot with rpy2 + lattice:带有 rpy2 + 点阵的曲面​​图:

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)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM