2017-05-08 52 views
0

我正在嘗試使天空中的星系團與它們的相對尺寸形成很好的可視化。因此,我正在製作每個星系團的點圖,然後嘗試在每個星系周圍放置一個圓圈。如何在未爲每個圓圈繪製新圖的情況下將多個圓添加到圖中?

這裏是到目前爲止我的代碼:

import matplotlib.pyplot as plt 
from pylab import * 

import csv 

with open("/Users/Olly/Documents/FINALVALUES/xPeak.csv", "rU") as x: 
    reader = csv.reader(x) 
    list1 = list(reader) 

with open("/Users/Olly/Documents/FINALVALUES/yPeak.csv", "rU") as y: 
    reader = csv.reader(y) 
    list2 = list(reader) 

with open("/Users/Olly/Documents/FINALVALUES/radius.csv", "rU") as r: 
    reader = csv.reader(r) 
    list3 = list(reader) 

xList = [] 
yList = [] 
rList = [] 

for i in list1: 
    for j in i: 
     xList.append(int(j)) 

for i in list2: 
    for j in i: 
     yList.append(int(j)) 

for i in list3: 
    for j in i: 
     rList.append(int(j)) 

#At this point I have my 3 lists for plotting 

plt.figure(1) 
plt.rc('text', usetex = True) 
plt.rc('font', family = 'serif') 
plt.plot(xList, yList, marker = '.', color = 'k', linestyle = 'None') 
plt.title('W1 galaxy cluster field') 
plt.xlabel(r'$\vartheta$ (arcmins)') 
plt.ylabel(r'$\vartheta$ (arcmins)')     
for i in range(len(xList)) 
    circle1 = plt.Circle((xList[i], yList[i]), rList[i], color = 'r') 
    fig, ax = plt.subplots() 
    ax.add_artist(circle1) 
plt.show() 

(的Xlist和yList是(X,Y)座標的星系團的中心,並且RLIST是羣集的半徑。)

因此,我首先創建我的點圖。然後,我遍歷每個數據點,以便爲每個數據點設計一個單獨的圓。

據我所知,編寫'fig,ax'會導致在該循環中創建的圓圈被添加到預定義的圖形(1)中。所以我不明白爲什麼每個圈子都會出現多個情節。

我該如何修改它,以便爲所有354個數據點創建一個圓,並將它們全部放在同一個圖上?

(編輯:這對於其他問題在堆棧中是獨一無二的,因爲其他問題不涉及導致多個繪圖的循環。這裏的問題不是如何繪製一個圓圈 - 如同其他問題 - 而是如何在代碼中需要循環時繪製多個圓圈)。

+0

可能重複的[matplotlib:添加繪圖圓](http://stackoverflow.com/questions/3439639/matplotlib-add-circle-to-plot) – Julien

回答

2

據我所知,編寫'fig,ax'會導致在該循環中創建的圓圈被添加到預定義的圖形中(1)。

正如所寫,這實際上會爲您的xList中的每個索引產生一個新的圖形和軸對。嘗試更換行:

plt.figure(1) 

有:

fig, ax = plt.subplots() 

和修改循環是:

for i in range(len(xList)): 
    circle1 = plt.Circle((xList[i], yList[i]), rList[i], color = 'r') 
    ax.add_artist(circle1) 

這種方式避免創建每個索引新圖的情況下,同時保持引用以數字對象fig和軸對象ax。 我不能與你的實際數據測試,但我認爲最終的片段應該是:

fig, ax = plt.subplots() 
plt.rc('text', usetex = True) 
plt.rc('font', family = 'serif') 
plt.plot(xList, yList, marker = '.', color = 'k', linestyle = 'None') 
plt.title('W1 galaxy cluster field') 
plt.xlabel(r'$\vartheta$ (arcmins)') 
plt.ylabel(r'$\vartheta$ (arcmins)')     
for i in range(len(xList)) 
    circle1 = plt.Circle((xList[i], yList[i]), rList[i], color = 'r') 
    ax.add_artist(circle1) 
plt.show() 

我希望這有助於。

+0

這是一種享受,謝謝。通常當我用python繪圖時,我使用markerfacecolor ='None'來消除繪圖標記的面部。出於某種原因,這不會在我的代碼中消除圈子的面部。我只是得到「未知財產markerfacecolor」。任何想法爲什麼? – ODP

+0

這可能是第二個問題(可能已經回答了),但'plt.Circle()'採用'facecolor' kwarg而不是'markerfacecolor',或者您可以指定'fill = False'。 – aorr