Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Polar contour plot in matplotlib - best (modern) way to do it?

Tags:

Update: I've done a full write-up of the way I found to do this on my blog at http://blog.rtwilson.com/producing-polar-contour-plots-with-matplotlib/ - you may want to check there first.

I'm trying to plot a polar contour plot in matplotlib. I've found various resources on the internet, (a) I can't seem to get my code to work and (b) many of the resources appear rather old, and I'm wondering if there is a better way now. For example, http://www.mail-archive.com/[email protected]/msg01953.html suggests that something may be done to improve things soon, and that was in 2006!

I'd love to be able to plot proper polar contour plots - like pcolor lets you do for its type of plot (see commented out section below), but I can't seem to find any way to do that, so I'm converting to cartesian co-ordinates first.

Anyway, I have the code that follows:

from pylab import * import numpy as np  azimuths = np.arange(0, 360, 10) zeniths = np.arange(0, 70, 10) values = []  for azimuth in azimuths:   for zenith in zeniths:     print "%i %i" % (azimuth, zenith)     # Run some sort of model and get some output     # We'll just use rand for this example     values.append(rand())  theta = np.radians(azimuths)  values = np.array(values) values = values.reshape(len(zeniths), len(azimuths))  # This (from http://old.nabble.com/2D-polar-surface-plot-td28896848.html) # works fine ############## # Create a polar axes # ax = subplot(111, projection='polar') # pcolor plot onto it # c = ax.pcolor(theta, zeniths, values) # show()  r, t = np.meshgrid(zeniths, azimuths)  x = r*np.cos(t) y = r*np.sin(t)  contour(x, y, values) 

When I run that I get an error TypeError: Inputs x and y must be 1D or 2D.. I'm not sure why I get this, as both x and y are 2D. Am I doing something wrong?

Also, it seems rather clunky to be putting my values returned from my model into a list and then reshaping it. Is there a better way to do this?

like image 854
robintw Avatar asked Jan 30 '12 21:01

robintw


People also ask

Which function is used to draw 3D contour plot?

contour3D() function creates three-dimensional contour plot. It requires all the input data to be in the form of two-dimensional regular grids, with the Z-data evaluated at each point. Here, we will show a three-dimensional contour diagram of a three-dimensional sinusoidal function.

How do you plot in 3D contour?

To plot 3D contour we will use countour3() to plot different types of 3D modules. Syntax: contour3(X,Y,Z): Specifies the x and y coordinates for the values in Z. contour3(Z): Creates a 3-D contour plot containing the isolines of matrix Z, where Z contains height values on the x-y plane.


2 Answers

You should just be able to use ax.contour or ax.contourf with polar plots just as you normally would... You have a few bugs in your code, though. You convert things to radians, but then use the values in degrees when you plot. Also, you're passing in r, theta to contour when it expects theta, r.

As a quick example:

import numpy as np import matplotlib.pyplot as plt  #-- Generate Data ----------------------------------------- # Using linspace so that the endpoint of 360 is included... azimuths = np.radians(np.linspace(0, 360, 20)) zeniths = np.arange(0, 70, 10)  r, theta = np.meshgrid(zeniths, azimuths) values = np.random.random((azimuths.size, zeniths.size))  #-- Plot... ------------------------------------------------ fig, ax = plt.subplots(subplot_kw=dict(projection='polar')) ax.contourf(theta, r, values)  plt.show() 

enter image description here

like image 178
Joe Kington Avatar answered Sep 22 '22 16:09

Joe Kington


the shape of x, y and values must be the same. Your data shape is:

>>> x.shape, y.shape, values.shape ((36, 7), (36, 7), (7, 36)) 

so change contour(x, y, values) to contour(x, y, values.T).

like image 25
HYRY Avatar answered Sep 18 '22 16:09

HYRY