2013-03-10 10 views
6

Chciałbym umieścić pół czarny, pół biały okrąg o promieniu R na początku fabuły matplotlib. Jestem świadomy, że istnieje Circle class, ale nie wiem, jak określić, że lewa połowa koła powinna być biała, a prawa połowa powinna być czarna. (Idealne rozwiązanie pozwoliłoby mi określić orientację koła - np. Powinienem móc go obrócić tak, aby na przykład wierzch mógł być biały, a spód czarny).Matplotlib half black and half white circle

+0

Powinieneś być w stanie to zrobić z dwóch 'Wedge's, ale mam problemy z dostaniem rzeczy działały prawidłowo ... –

+0

@JoeKington - Uh-oh. Jeśli nie udaje ci się sprawić, że działa, to trochę zniechęca dla mnie ;-) (Widziałem twoją pracę matplotlib na SO ... To jest naprawdę imponujące) – mgilson

+0

Dzięki! Okazuje się, że robiłem coś głupiego. Dwa kliny działają idealnie, jeśli nie dodajesz losowych literówek do rzeczy! –

Odpowiedz

14

Najprostszym sposobem jest użycie dwóch Wedge s. (To nie jest automatycznie przeskalować osie, ale to łatwo dodawać, jeśli chcesz).

Jako szybki przykład:

import matplotlib.pyplot as plt 
from matplotlib.patches import Wedge 

def main(): 
    fig, ax = plt.subplots() 
    dual_half_circle((0.5, 0.5), radius=0.3, angle=90, ax=ax) 
    ax.axis('equal') 
    plt.show() 

def dual_half_circle(center, radius, angle=0, ax=None, colors=('w','k'), 
        **kwargs): 
    """ 
    Add two half circles to the axes *ax* (or the current axes) with the 
    specified facecolors *colors* rotated at *angle* (in degrees). 
    """ 
    if ax is None: 
     ax = plt.gca() 
    theta1, theta2 = angle, angle + 180 
    w1 = Wedge(center, radius, theta1, theta2, fc=colors[0], **kwargs) 
    w2 = Wedge(center, radius, theta2, theta1, fc=colors[1], **kwargs) 
    for wedge in [w1, w2]: 
     ax.add_artist(wedge) 
    return [w1, w2] 

main() 

enter image description here

Gdybyś to podoba aby zawsze być u źródła, możesz określić transformację jako ax.transAxes i wyłączyć obcinanie.

E.g.

import matplotlib.pyplot as plt 
from matplotlib.patches import Wedge 

def main(): 
    fig, ax = plt.subplots() 
    dual_half_circle(radius=0.1, angle=90, ax=ax) 
    ax.axis('equal') 
    plt.show() 

def dual_half_circle(radius, angle=0, ax=None, colors=('w','k'), **kwargs): 
    """ 
    Add two half circles to the axes *ax* (or the current axes) at the lower 
    left corner of the axes with the specified facecolors *colors* rotated at 
    *angle* (in degrees). 
    """ 
    if ax is None: 
     ax = plt.gca() 
    kwargs.update(transform=ax.transAxes, clip_on=False) 
    center = (0, 0) 
    theta1, theta2 = angle, angle + 180 
    w1 = Wedge(center, radius, theta1, theta2, fc=colors[0], **kwargs) 
    w2 = Wedge(center, radius, theta2, theta1, fc=colors[1], **kwargs) 
    for wedge in [w1, w2]: 
     ax.add_artist(wedge) 
    return [w1, w2] 

main() 

Jednak spowoduje to, że "okrąg" koła będzie zależał od współczynnika kształtu obrysu osi. (Możesz ominąć to na kilka sposobów, ale staje się bardziej skomplikowany. Daj mi znać, jeśli to masz na myśli i pokażę bardziej rozbudowany przykład.) Mogłem też źle zrozumieć, co miałeś na myśli "u źródła ".

+0

Tak. Właśnie tego chcę. Dzięki :) – mgilson

+0

Nie ma problemu! Mam nadzieję, że to pomoże! –

+0

add_artist nie działa dla mnie. Muszę użyć add_patch. Działa to w wersji 1.4.2 i użyłem tego również w wielu wcześniejszych wersjach. –

5

Możesz użyć wypełnionego w połowie kółka Unicode (U + 25D0), jeśli masz czcionkę z tym symbolem. Dziwnie, nie jest to w STIX (dołączone do matplotlib), ale wiem, że jest w DejaVu Sans, więc użyję go stamtąd.

enter image description here

import matplotlib.pyplot as plt 
import matplotlib.font_manager 
from numpy import * 

path = '/full/path/to/font/DejaVuSans.ttf' 
f0 = matplotlib.font_manager.FontProperties()  
f0.set_file(path) 

plt.figure() 
plt.xlim(-1.2,1.2) 
plt.ylim(-1.2,1.2) 

for angle in arange(0, 2*pi, 2*pi/10): 
    x, y = cos(angle), sin(angle) 
    plt.text(x, y, u'\u25D0', fontproperties=f0, rotation=angle*(180/pi), size=30) 

plt.show() 
+0

To jest miłe, ale nie możesz określić rozmiaru kręgów w jednostkach osi, co właśnie tutaj chcę. – mgilson