2014-09-24 8 views
5

Sto tentando di aggiungere etichette manuali al Contourplot nel seguente codice. Le etichette sono stampate in modo casuale. Qualcuno ha un'idea su come risolvere questo problema? Sembra un bug in Matplotlib.Impostazione delle etichette manualmente nel plotplash del contorno di matplotlib errato

saluti, David

import numpy as np 
import matplotlib.pyplot as plt 

a = 0.2 

resolution = 100 
xarray = np.linspace(0,0.25,num=resolution) 
yarray = np.linspace(0,1,num=resolution) 

A = np.empty([resolution,resolution]) 

xc = 0 
yc = 0 
for x in xarray: 
    for y in yarray: 
     #print xc,yc 

     wp = 1./np.pi*np.arctan(np.sin(np.pi*y)*np.sinh(np.pi*a/2.)/ 
       (np.cosh(np.pi*x)-np.cos(np.pi*y)*np.cosh(np.pi*a/2.))) 

     if wp <= 0: 
      wp = wp+1 
      A[xc, yc] = wp 
     else: 
      A[xc, yc] = wp 
     yc += 1 
    yc=0 
    xc += 1 

A = A.transpose() 
B = np.fliplr(A) 
AB = np.hstack((B,A)) 
fullx = np.hstack((-xarray[::-1],xarray)) 

#plot 
fig = plt.figure() 
fig.suptitle("Weighting potential") 
ax = plt.subplot(1,1,1) 
CS = plt.contour(fullx,yarray,AB,10, colors='k') 

labelpos = np.dstack((np.zeros(9),np.arange(0.1,1,0.1)))[0] 
plt.clabel(CS,inline=True, fmt='%1.1f',fontsize=9, manual=labelpos) 

plt.show() 

enter image description here

+1

se si tenta di utilizzare più di 5 etichette, si ottiene il primo (0,1) ripetuto nella curva superiore. con 'np.dstack ((np.zeros (4), np.arange (0.1,0.5,0.1))) [0]' ottieni una figura corretta. sembra un errore anche per me – joaquin

risposta

2

Questo è il comportamento previsto.

Seleziona la curva di contorno più vicina per ciascuna coordinata di dati x, y contenuta nel parametro manual. Quando viene trovata la stessa curva di contorno per molte coordinate, potrebbe accadere che inizieranno ad agglomerarsi, come nel tuo caso.

Se è stato utilizzato:

y_pick = [0.01, 0.025, 0.05, 0.075, 0.1, 0.15, 0.2, 0.3, 0.5] 
labelpos = ((0, i) for i in y_pick) 

si potrebbe ottenere qualcosa di simile:

enter image description here


Fuori tema:

si può vettorizzare il codice evitando il relativamente lento for loop:

import numpy as np 
import matplotlib.pyplot as plt 

a = 0.2 

def fwp(x, y, a): 
    return (1./np.pi*np.arctan(np.sin(np.pi*y)*np.sinh(np.pi*a/2.)/ 
      (np.cosh(np.pi*x)-np.cos(np.pi*y)*np.cosh(np.pi*a/2.)))) 

resolution = 100 
xarray = np.linspace(0, 0.25, num=resolution) 
yarray = np.linspace(0, 1, num=resolution) 
x, y = np.meshgrid(xarray, yarray, copy=False) 
A = fwp(x, y, a) 
A[A<=0] += 1 
B = np.fliplr(A) 
AB = np.hstack((B, A)) 
+0

Grazie per la risposta e la mancia! – user338095

Problemi correlati