【问题标题】:How can I add multiple circles to a plot without getting a new plot for each circle?如何在不为每个圆获取新图的情况下将多个圆添加到图?
【发布时间】:2017-05-08 22:03:13
【问题描述】:

我正在尝试对天空中的星系团及其相对大小进行可视化。所以我正在制作每个星系团的点图,然后尝试在每个星系团周围放置一个圆圈。

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

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

(编辑:这是堆栈上的其他问题所独有的,因为其他问题不涉及导致多个图的循环。这里的问题不是如何绘制一个圆圈 - 就像在其他问题中一样 - 而是如何当代码中需要循环时,绘制许多圆圈。)

【问题讨论】:

标签: python matplotlib plot


【解决方案1】:

据我所知,写 '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。 我无法用你的实际数据进行测试,但我认为最终的 sn-p 应该是:

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()

我希望这会有所帮助。

【讨论】:

  • 这是一种享受,谢谢。通常当我使用 python 绘图时,我使用 markerfacecolor = 'None' 来消除绘图标记的面。出于某种原因,这不适用于我的代码以消除圆圈的面孔。我刚得到“未知属性markerfacecolor”。任何想法为什么?
  • 这可能是第二个问题(并且可能已经回答),但plt.Circle() 采用facecolor kwarg 而不是markerfacecolor,或者您可以指定fill=False
猜你喜欢
  • 2023-02-14
  • 1970-01-01
  • 2020-11-11
  • 2015-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多