如何在不为每个圆圈创建新绘图的情况下向绘图添加多个圆圈?

时间:2017-05-08 22:03:13

标签: python matplotlib plot

我试图通过它们的相对大小来显示天空中星系团的可视化。所以我正在制作每个星系团的点图,然后试图在每个星系周围放一个圆圈。

到目前为止,这是我的代码:

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个数据点创建一个圆圈,并将它们全部放在同一个图表上?

(编辑:这对于堆叠上的其他问题是唯一的,因为其他问题不涉及导致多个图的循环。这里的问题不是如何绘制圆 - 如在其他问题中 - 而是如何在代码中需要循环时绘制多个圆圈。)

1 个答案:

答案 0 :(得分:2)

  

据我所知,写'无花果,斧头'应该使该循环中创建的圆被添加到预定义的图形(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()

我希望这会有所帮助。