2017-07-11 1 views
0

Ich möchte Kreise über einem 2D-Diagramm in Matplotlib als Positionsmarkierungen überlagern. Zur Zeit sehen sie sehr viel wie das, was sie sind, farbige Kreise:Rendern Sie einen Kreis, so dass er in Matplotlib als 3D-Kugel erscheint

import matplotlib.pyplot as plt 

plt.axes() 

circle = plt.Circle((0, 0), radius=0.3,fc='b') 
circle1 = plt.Circle((1, 1), radius=0.3, fc='y') 
circle2 = plt.Circle((1, 0), radius=0.3, fc='r') 
plt.gca().add_patch(circle) 
plt.gca().add_patch(circle1) 
plt.gca().add_patch(circle2) 

plt.axis('scaled') 
plt.show() 

Gibt es eine Möglichkeit Thesen zu geben, das Aussehen eines 3D-Objekt umkreist ohne MayaVi zu verwenden?

Dies sind Beispiele für mein Ziel:

enter image description here

EDIT

Mit den Informationen in dem von user3419537 geliefert Link und die Idee, hier Custom color maps präsentiert ich die folgende Idee geschaffen, die lassen mich irgendwie plot Kreise mit einem Gefälle gefüllt:

import numpy as np 

import matplotlib.colors as mcolors 


def make_colormap(seq): 
    """Return a LinearSegmentedColormap 
    seq: a sequence of floats and RGB-tuples. The floats should be increasing 
    and in the interval (0,1). 
    """ 
    seq = [(None,) * 3, 0.0] + list(seq) + [1.0, (None,) * 3] 
    cdict = {'red': [], 'green': [], 'blue': []} 
    for i, item in enumerate(seq): 
     if isinstance(item, float): 
      r1, g1, b1 = seq[i - 1] 
      r2, g2, b2 = seq[i + 1] 
      cdict['red'].append([item, r1, r2]) 
      cdict['green'].append([item, g1, g2]) 
      cdict['blue'].append([item, b1, b2]) 
    return mcolors.LinearSegmentedColormap('CustomMap', cdict) 



def gauplot(centers, radiuses, xr=None, yr=None, P_color='black'): 
     c = mcolors.ColorConverter().to_rgb 
     # Maybe it is possible to change the values to get a better gradient? 
     current_cmap = make_colormap([c(P_color),0.05,c(P_color),0.1,c(P_color), c('white')])    
     nx, ny = 1000.,1000. 
     xgrid, ygrid = np.mgrid[xr[0]:xr[1]:(xr[1]-xr[0])/nx,yr[0]:yr[1]:(yr[1]-yr[0])/ny] 
     im = xgrid*0 + np.nan 
     xs = np.array([np.nan]) 
     ys = np.array([np.nan]) 
     fis = np.concatenate((np.linspace(-np.pi,np.pi,100), [np.nan])) 
     #cmap = plt.cm.gray 
     cmap = current_cmap 
     cmap.set_bad('white') 
     thresh = 2.8 
     for curcen,currad in zip(centers,radiuses): 
       curim=(((xgrid-curcen[0])**2+(ygrid-curcen[1])**2)**.5)/currad*thresh 
       im[curim<thresh]=np.exp(-.5*curim**2)[curim<thresh] 
       xs = np.append(xs, curcen[0] + currad * np.cos(fis)) 
       ys = np.append(ys, curcen[1] + currad * np.sin(fis)) 
     plt.imshow(im.T, cmap=cmap, extent=xr+yr) 
     plt.plot(xs, ys, 'r-') 

gauplot([(0,0), (2,3), (5,1), (6, 7), (6.1, 6.1)], [.3,.4, .5, 1, .4], [-1,10], [-1,10],P_color="#75507b") 

plt.show()   

Leider nur die roten Kreise erscheinen an der richtigen Stelle:

OUTPUT

Ich würde einen Tipp schätzen, was die Ursache dafür sein könnte.

Im Moment ich so meine Kreise im Skript in Frage bin Plotten:

circle = Circle(x,y,*kwargs) 
plt.gca().add_patch(circle) 

wäre es möglich, die obige Lösung in einer Art und Weise anzupassen, dass es Kreise mit verschiedenen Farben an der Position dargestellt werden kann, (x, y) und überlagern sie auch einem vorhandenen Plot?

+2

Wie wäre es etwas, um [diese] (https://stackoverflow.com/a/10995481/3419537)? – user3419537

+0

Sie könnten ein Bild verwenden, wie in [diese Frage] (https://stackoverflow.com/questions/44989950/place-an-image-between-custom-lines-in-a-plot-in-python) und ersetzen Sie die Blaubeeren mit Ihrem Bild. – ImportanceOfBeingErnest

+0

@ user3419537 Danke, das sieht nach einer Lösung aus, die ich anpassen könnte! – NorrinRadd

Antwort

0

Das IMshow-Plot wird gegen die gewünschte Plot gespiegelt. Dies liegt daran, dass das Imshow-Plot seinen Ursprung in der oberen linken Ecke hat, aber das Plot, das die Kreise zeigt, hat seinen Ursprung in der unteren linken Ecke.

Die Lösung wäre, den Ursprung des imshow in der linken unteren Ecke wie

plt.imshow(im.T, cmap=cmap, extent=xr+yr, origin="lower") 
Verwandte Themen