Sombra ‘celdas’ en plot polar con matplotlib

Tengo un montón de puntos distribuidos regularmente (θ = n * π / 6, r = 1 … 8), cada uno con un valor en [0, 1]. Puedo trazarlos con sus valores en matplotlib usando

polar(thetas, rs, c=values) 

Pero en lugar de tener solo un pequeño punto, me gustaría sombrear la ‘celda’ correspondiente (es decir, todo hasta la mitad de los puntos adyacentes) con el color correspondiente al valor del punto:

Trama polar con celdas sombreadas.

(Tenga en cuenta que aquí mis valores son solo [0, .5, 1], en realidad estarán todos entre 0 y 1. ¿Hay alguna forma directa de darse cuenta de esto (o algo lo suficientemente cerca) con matplotlib? Tal vez sea más fácil ¿Pensarlo como un histogtwig 2D?

¡Por supuesto! Sólo tiene que utilizar pcolormesh en un eje polar.

P.ej

 import matplotlib.pyplot as plt import numpy as np # Generate some data... # Note that all of these are _2D_ arrays, so that we can use meshgrid # You'll need to "grid" your data to use pcolormesh if it's un-ordered points theta, r = np.mgrid[0:2*np.pi:20j, 0:1:10j] z = np.random.random(theta.size).reshape(theta.shape) fig, (ax1, ax2) = plt.subplots(ncols=2, subplot_kw=dict(projection='polar')) ax1.scatter(theta.flatten(), r.flatten(), c=z.flatten()) ax1.set_title('Scattered Points') ax2.pcolormesh(theta, r, z) ax2.set_title('Cells') for ax in [ax1, ax2]: ax.set_ylim([0, 1]) ax.set_yticklabels([]) plt.show() 

introduzca la descripción de la imagen aquí

Si sus datos aún no están en una cuadrícula regular, deberá cuadrarlos para usar pcolormesh.

Sin embargo, parece que está en una cuadrícula regular de tu ttwig. En ese caso, la cuadrícula es bastante simple. Si ya está ordenado, puede ser tan simple como llamar a una reshape . De lo contrario, un simple bucle o explotar numpy.histogram2d con sus valores z como pesos hará lo que necesite.

Esto se puede hacer bastante bien tratándolo como un gráfico de barras astackdas polares:

 import matplotlib.pyplot as plt import numpy as np from random import choice fig = plt.figure() ax = fig.add_axes([0.1, 0.1, 0.8, 0.8], polar=True) for i in xrange(12*8): color = choice(['navy','maroon','lightgreen']) ax.bar(i * 2 * np.pi / 12, 1, width=2 * np.pi / 12, bottom=i / 12, color=color, edgecolor = color) plt.ylim(0,10) ax.set_yticks([]) plt.show() 

Produce:

introduzca la descripción de la imagen aquí

Bueno, en general está bastante sin pulir, pero aquí hay una versión que completa las secciones.

 from matplotlib.pylab import * ax = subplot(111, projection='polar') # starts grid and colors th = array([pi/6 * n for n in range(13)]) # so n = 0..12, allowing for full wrapping r = array(range(9)) # r = 0..8 c = array([[random_integers(0, 10)/10 for y in range(th.size)] for x in range(r.size)]) # The smoothing TH = cbook.simple_linear_interpolation(th, 10) # Properly padding out C so the colors go with the right sectors (can't remember the proper word for such segments of wedges) # A much more elegant version could probably be created using stuff from itertools or functools C = zeros((r.size, TH.size)) oldfill = 0 TH_ = TH.tolist() for i in range(th.size): fillto = TH_.index(th[i]) for j, x in enumerate(c[:,i]): C[j, oldfill:fillto].fill(x) oldfill = fillto # The plotting th, r = meshgrid(TH, r) ax.pcolormesh(th, r, C) show()