2013-05-10 4 views
3

В настоящее время я пишу программу, которая должна генерировать набор графиков. КАЖДЫЙ график должен иметь 3 концентрических круга, радиусы которых определяются набором данных. Кроме того, необходимо добавить еще один красный цвет круга, который может иметь другой центр. Однако я столкнулся с различными проблемами. Если радиус круга/s слишком велик, я должен увидеть 3 черных и 1 красный круг на графике, но я этого не сделаю.Странное поведение модуля Matplotlib Python - построение круга

Я выделил кусок кода, который делает сюжет и вот он -

import matplotlib.pyplot as plt 

fig1 = plt.figure(1, figsize=(6,6)) 
plt.xlim(-30,30) 
plt.ylim(-30,30) 

rcircle1 = plt.Circle((0,0), 6.0, edgecolor="black", facecolor="white") 
rcircle2 = plt.Circle((0,0), 12.0, edgecolor="black", facecolor="white") 
rcircle3 = plt.Circle((0,0), 18.0, edgecolor="black", facecolor="white") 
bcircle = plt.Circle((8.5,-5.8) ,2, edgecolor="red", facecolor="white") 

ax = fig1.gca() 
ax.add_artist(rcircle1) 
ax.add_artist(rcircle2) 
ax.add_artist(rcircle3) 
ax.add_artist(bcircle) 

fig1.savefig("Model.png", dpi=150) 

Выход для выше -

Output of above code.

Я пытался смотреть в различных класса переменных, связанных с Circle() и add_artist(), но не удалось найти что-то, что может повлиять на это поведение.

Моя текущая работа вокруг следующий код -

import numpy as np 
import matplotlib.pyplot as plt 

th = np.arange(-3.14,3.14,0.01) 

fig1 = plt.figure(1,figsize=(6,6)) 
plt.xlim(-30,30) 
plt.ylim(-30,30) 

plt.plot(6*np.cos(th), 6*np.sin(th), color="black") 
plt.plot(12*np.cos(th), 12*np.sin(th), color="black") 
plt.plot(18*np.cos(th), 18*np.sin(th), color="black") 
# (8,5, -5,8) 
plt.plot(2*np.cos(th) + 8.5, 2*np.sin(th) - 5.8, color="red") 

fig1.savefig("Hard.png", dpi=150) 

Выход сгенерированных кода именно то, что я хочу быть!

enter image description here

Хотя это делает работу, он побеждает цель наличия Circle() как методы в Matplotlib. Может кто-нибудь прокомментировать, почему первый код не работает, как я ожидаю?

ответ

6

Ваша проблема заключается в аргументе facecolor. Вы добавляете самый большой круг последним, и он имеет непрозрачный центр.

Во втором примере вы рисуете линию, а не «заполненный» круг.

Либо изменить порядок добавления кругов (или поставить zorder kwarg), или передать в facecolor='none' (Примечание: это строка "none", а не объект None), чтобы получить «незаполненный» круг.

+0

Спасибо, Джо. Решение работало, просто не осознавало важность заказа. Я попытался ввести значение «альфа», но так или иначе это не сработало. Я думаю, что «альфа» не работает для этих типов объектов. Или, может быть, я что-то делал неправильно. Еще раз спасибо. – Killer

+0

Что бы это ни стоило, 'alpha' должен работать нормально. Однако это относится как к заполнению, так и к контуру художника matplotlib, поэтому, если вы установите 'alpha = 0', ничего не будет нарисовано. Рад, что вы его работали, во всяком случае! –

Смежные вопросы