I have some surface data that is generated by an external program as XYZ values. I want to create the following graphs, using matplotlib:
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 i.e. 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.
So, my question is this: given a set of (X,Y,Z) points, how may I generate Surface and contour plots from that data?
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.
3D plotting in Matplotlib starts by enabling the utility toolkit. We can enable this toolkit by importing the mplot3d library, which comes with your standard Matplotlib installation via pip. Just be sure that your Matplotlib version is over 1.0. Now that our axes are created we can start plotting in 3D.
for do a contour plot you need interpolate your data to a regular grid 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
>>> 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
>>> 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
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With