英文:
How to remove this error: AttributeError: 'Polygon' object has no property 'colour'
问题
我尝试在Python中模拟一个音乐舞台,并且在尝试向舞台添加灯光时遇到了这个错误。以下是我的代码:
import matplotlib.pyplot as plt
import numpy as np
import math
class Light:
def __init__(self, colour, position, direction, intensity, distribution):
self.colour = colour
self.position = position
self.direction = direction
self.intensity = intensity
self.distribution = distribution
def calculate_cone(self):
spread_angle = math.radians(self.distribution)
half_cone_angle = spread_angle / 2
start_angle = self.direction - half_cone_angle
end_angle = self.direction + half_cone_angle
class Stage:
def __init__(self, figsize=(10, 10)):
self.fig, (self.ax0, self.ax1) = plt.subplots(2, 1, gridspec_kw={'height_ratios': [1, 10]}, figsize=(10, 10))
self.ax0.set_aspect("equal")
self.ax0.fill([0, 500, 500, 0], [0, 0, 50, 50], 'k')
self.ax1.set_aspect("equal")
self.ax1.fill([0, 500, 500, 0], [0, 0, 500, 500], 'k')
self.title = "STAGEVIEW"
self.lights = []
self.smoke_machines = []
def add_circle(self, centre, radius, colour):
circle = plt.Circle(centre, radius)
self.ax0.add_patch(circle)
def add_light(self, light):
self.lights.append(light)
spread = np.array(light.distribution)
self.ax1.fill(spread[:, 0], spread[:, 1], color=light.colour, alpha=0.5)
def simulate_lights(self):
for light in self.lights:
light.calculate_cone()
def show(self):
plt.suptitle(self.title, fontsize="18")
stage = Stage()
stage.add_circle([50, 25], 20, 'steelblue')
stage.add_circle([150, 25], 20, 'lightblue')
stage.add_circle([250, 25], 20, 'steelblue')
stage.add_circle([350, 25], 20, 'lightblue')
stage.add_circle([450, 25], 20, 'steelblue')
lights = [Light(colour="red", position=[250, 490], direction=90, intensity=1, distribution=[[230, 490], [270, 490], [270, 500], [230, 500]])]
for light in lights:
stage.add_light(light)
stage.simulate_lights()
stage.show()
你尝试向舞台添加灯光,希望在matplotlib中看到它,但一直遇到这个错误:
AttributeError: 'Polygon' object has no property 'colour'
这个错误是由于在self.ax1.fill()
中使用了colour
而不是color
引起的。我已经将其更正为color
,请尝试重新运行你的代码。
希望这可以帮助你解决问题。如果还有其他问题,请随时提问。
英文:
I'm trying to simulate a music stage in Python, and I keep coming across this error when trying to add lights to the stage. This is my code below.
import matplotlib.pyplot as plt
import numpy as np
import math
class Light:
def __init__(self, colour, position, direction, intensity, distribution):
self.colour = colour
self.position = position
self.direction = direction
self.intensity = intensity
self.distribution = distribution
def calculate_cone(self):
spread_angle = math.radians(self.distribution)
half_cone_angle = spread_angle/2
start_angle = self.direction - half_cone_angle
end_angle = self.direction + half_cone_angle
class Stage:
def __init__(self, figsize=(10,10)):
self.fig, (self.ax0, self.ax1)=plt.subplots(2, 1, gridspec_kw={'height_ratios': [1, 10]}, figsize = (10,10))
self.ax0.set_aspect("equal")
self.ax0.fill([0,500,500,0],[0,0,50,50],'k')
self.ax1.set_aspect("equal")
self.ax1.fill([0,500,500,0],[0,0,500,500],'k')
self.title=("STAGEVIEW")
self.lights=[]
self.smoke_machines=[]
def add_circle(self, centre, radius, colour):
circle=plt.Circle(centre, radius)
self.ax0.add_patch(circle)
def add_circle(self, centre, radius, colour):
circle=plt.Circle(centre, radius)
self.ax0.add_patch(circle)
def add_light(self, light):
self.lights.append(light)
spread=np.array(light.distribution)
self.ax1.fill(spread[:,0], spread[:,1], colour=light.colour, alpha=0.5)
def simulate_lights(self):
for lights in self.lights:
light.calculate_cone()
def show(self):
plt.suptitle(self.title, fontsize="18")
stage = Stage()
stage.add_circle([50,25],20, 'steelblue')
stage.add_circle([150,25],20, 'lightblue')
stage.add_circle([250,25],20, 'steelblue')
stage.add_circle([350,25],20, 'lightblue')
stage.add_circle([450,25],20, 'steelblue')
lights = [Light(colour="red",position[250,490],direction=90,intensity=1,distribution=[[230,490],[270,490], [270,500],[230,500]])]
for light in lights:
stage.add_light(light)
stage.simulate_lights()
stage.show()
I tried to add a light to my stage, and thought I'd be able to see it in matplotlib, but keep getting this error:
I have changed the light class to the correct class, but now I get a big error message regarding polygon colours.
Traceback (most recent call last):
File "samplestage(1).py", line 75, in <module>
stage.add_light(light)
File "samplestage(1).py", line 56, in add_light
self.ax1.fill(spread[:,0], spread[:,1], colour=light.colour, alpha=0.5)
File "/usr/local/lib/python3.6/dist-packages/matplotlib/axes/_axes.py", line 5037, in fill
patches = [*self._get_patches_for_fill(*args, data=data, **kwargs)]
File "/usr/local/lib/python3.6/dist-packages/matplotlib/axes/_base.py", line 216, in __call__
yield from self._plot_args(this, kwargs)
File "/usr/local/lib/python3.6/dist-packages/matplotlib/axes/_base.py", line 364, in _plot_args
for j in range(max(ncx, ncy))]
File "/usr/local/lib/python3.6/dist-packages/matplotlib/axes/_base.py", line 364, in <listcomp>
for j in range(max(ncx, ncy))]
File "/usr/local/lib/python3.6/dist-packages/matplotlib/axes/_base.py", line 307, in _makefill
seg.set(**kwargs)
File "/usr/local/lib/python3.6/dist-packages/matplotlib/artist.py", line 1101, in set
return self.update(props)
File "/usr/local/lib/python3.6/dist-packages/matplotlib/artist.py", line 1006, in update
ret = [_update_property(self, k, v) for k, v in props.items()]
File "/usr/local/lib/python3.6/dist-packages/matplotlib/artist.py", line 1006, in <listcomp>
ret = [_update_property(self, k, v) for k, v in props.items()]
File "/usr/local/lib/python3.6/dist-packages/matplotlib/artist.py", line 1002, in _update_property
.format(type(self).__name__, k))
AttributeError: 'Polygon' object has no property 'colour'
I am not sure what to do with this error. I am going to be trying to add multiple lights, to match the circles on the 'stage', but I cannot even get one light to work.
I appreciate the help.
I'm just learning Python, so it can be hard to me to see where I went wrong.
Thank you
答案1
得分: 1
I figure it out now, it is "color" not "colour".
Also I change some codes, you can check it like:
spread_angle = np.radians(self.distribution)
...
self.ax1.fill(spread[:,0], spread[:,1], color=light.colour, alpha=0.5)
...
plt.show()
plt.close()
# stage.show()
the whole codes is here:
import matplotlib.pyplot as plt
import numpy as np
import math
class Light:
def __init__(self, colour, position, direction, intensity, distribution):
self.colour = colour
self.position = position
self.direction = direction
self.intensity = intensity
self.distribution = distribution
def calculate_cone(self):
spread_angle = np.radians(self.distribution)
half_cone_angle = spread_angle / 2
start_angle = self.direction - half_cone_angle
end_angle = self.direction + half_cone_angle
class Stage:
def __init__(self, figsize=(10,10)):
self.fig, (self.ax0, self.ax1)=plt.subplots(2, 1, gridspec_kw={'height_ratios': [1, 10]}, figsize = (10,10))
self.ax0.set_aspect("equal")
self.ax0.fill([0,500,500,0],[0,0,50,50],'k')
self.ax1.set_aspect("equal")
self.ax1.fill([0,500,500,0],[0,0,500,500],'k')
self.title="STAGEVIEW"
self.lights=[]
self.smoke_machines=[]
def add_circle(self, centre, radius, colour):
circle=plt.Circle(centre, radius)
self.ax0.add_patch(circle)
def add_light(self, light):
self.lights.append(light)
spread=np.array(light.distribution)
self.ax1.fill(spread[:,0], spread[:,1], color=light.colour, alpha=0.5)
def simulate_lights(self):
for lights in self.lights:
lights.calculate_cone()
def show(self):
plt.suptitle(self.title, fontsize="18")
stage = Stage()
stage.add_circle([50,25],20, 'steelblue')
stage.add_circle([150,25],20, 'lightblue')
stage.add_circle([250,25],20, 'steelblue')
stage.add_circle([350,25],20, 'lightblue')
stage.add_circle([450,25],20, 'steelblue')
lights = [Light(colour="red",position=[250,390],direction=90,intensity=1,distribution=[[230,390],[270,390], [270,500],[230,500]])]
for light in lights:
stage.add_light(light)
stage.simulate_lights()
plt.show()
plt.close()
# stage.show()
英文:
I figure it out now, it is "color" not "colour".<br>
Also I change some codes, you can check it like: <br>
spread_angle = np.radians(self.distribution)
...
self.ax1.fill(spread[:,0], spread[:,1], color=light.colour, alpha=0.5)
...
plt.show()
plt.close()
# stage.show()
the whole codes is here<br>
import matplotlib.pyplot as plt
import numpy as np
import math
class Light:
def __init__(self, colour, position, direction, intensity, distribution):
self.colour = colour
self.position = position
self.direction = direction
self.intensity = intensity
self.distribution = distribution
def calculate_cone(self):
spread_angle = np.radians(self.distribution) #np.array([math.radians(i) for i in self.distribution])
half_cone_angle = spread_angle / 2
start_angle = self.direction - half_cone_angle
end_angle = self.direction + half_cone_angle
class Stage:
def __init__(self, figsize=(10,10)):
self.fig, (self.ax0, self.ax1)=plt.subplots(2, 1, gridspec_kw={'height_ratios': [1, 10]}, figsize = (10,10))
self.ax0.set_aspect("equal")
self.ax0.fill([0,500,500,0],[0,0,50,50],'k')
self.ax1.set_aspect("equal")
self.ax1.fill([0,500,500,0],[0,0,500,500],'k')
self.title=("STAGEVIEW")
self.lights=[]
self.smoke_machines=[]
def add_circle(self, centre, radius, colour):
circle=plt.Circle(centre, radius)
self.ax0.add_patch(circle)
def add_light(self, light):
self.lights.append(light)
spread=np.array(light.distribution)
self.ax1.fill(spread[:,0], spread[:,1], color=light.colour, alpha=0.5)
def simulate_lights(self):
for lights in self.lights:
lights.calculate_cone()
def show(self):
plt.suptitle(self.title, fontsize="18")
stage = Stage()
stage.add_circle([50,25],20, 'steelblue')
stage.add_circle([150,25],20, 'lightblue')
stage.add_circle([250,25],20, 'steelblue')
stage.add_circle([350,25],20, 'lightblue')
stage.add_circle([450,25],20, 'steelblue')
lights = [Light(colour="red",position=[250,390],direction=90,intensity=1,distribution=[[230,390],[270,390], [270,500],[230,500]])]
for light in lights:
stage.add_light(light)
stage.simulate_lights()
plt.show()
plt.close()
# stage.show()
答案2
得分: 0
你试图传递Light
类的colour
属性。
但是,你使用了self.colour
,它引用了Stage
类,而Stage
类没有colour
属性,因此引发了这个错误。
将你的add_light
方法从这个:
def add_light(self, light):
self.lights.append(light)
spread=np.array(light.distribution)
self.ax1.fill(spread[:,0], spread[:,1], colour=self.colour, alpha=0.5)
更新为这个:
def add_light(self, light):
self.lights.append(light)
spread=np.array(light.distribution)
self.ax1.fill(spread[:,0], spread[:,1], colour=light.colour, alpha=0.5)
将解决你的问题。
英文:
You are trying to pass the colour
attribute of the Light
class.
But instead of using light.colour
, you're using self.colour
, which references the class Stage
, which does not have the colour
attribute, thus raising this error.
Updating your add_light
method from this:
def add_light(self, light):
self.lights.append(light)
spread=np.array(light.distribution)
self.ax1.fill(spread[:,0], spread[:,1], colour=self.colour, alpha=0.5)
to this:
def add_light(self, light):
self.lights.append(light)
spread=np.array(light.distribution)
self.ax1.fill(spread[:,0], spread[:,1], colour=light.colour, alpha=0.5)
would solve your issue.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论