对网站来说是全新的,对Python也是新手,所以帮助和提示表示赞赏。
我有一些(x,y)数据围绕一个中心形成几条近似圆形的曲线。但是为了这个例子,我只创建了一些(x,y)形成圆圈。
现在,我想绘制那些并根据颜色填充那些多边形之间的空间,假设一个函数获得的某些(z)值,以便每个“环”都有自己的阴影。
这是我现在已经想到的。
import matplotlib.pyplot as plt
import numpy as np
from math import sin, cos
from matplotlib.patches import Polygon
from matplotlib.collections import PatchCollection
r = np.array([0.1, 0.2, 0.3, 0.4, 0.5 ,0.6, 0.7, 0.8, 0.9, 1.0])
fig, ax = plt.subplots(1)
ax.set_xlim([-1.1, 1.1])
ax.set_ylim([-1.1, 1.1])
x=[]
y=[]
patches = []
colors=np.array([0.9,0.8, 0.1, 0.1, 0.1, 0.4, 0.2,0.8,0.1, 0.9])
for radius in r:
for phi in np.linspace(0, 360, 200, endpoint=True):
x.append(radius*cos(np.deg2rad(phi)))
y.append(radius*sin(np.deg2rad(phi)))
points = np.vstack([x,y]).T
polygon = Polygon(points,False)
patches.append(polygon)
p = PatchCollection(patches, cmap="Blues" )
p.set_array(colors)
ax.add_collection(p)
plt.show()
给我:rings
如果有完全不同的方法,请随时告诉我。
答案 0 :(得分:1)
您需要添加从最大到最小的圆圈,这样它们就不会相互重叠。
我使用了plot a circle with pyplot 和http://matplotlib.org/users/colormaps.html
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.cm as cm
r = np.arange(1, 0, -0.1)
fig, ax = plt.subplots(1)
ax.set_xlim([-1.1, 1.1])
ax.set_ylim([-1.1, 1.1])
color_vec = np.array([0.9, 0.8, 0.1, 0.1, 0.1, 0.4, 0.2, 0.8, 0.1, 0.9])
colors = cm.get_cmap("Blues")(color_vec)
for i, radius in enumerate(r):
circle = plt.Circle((0, 0), radius, color=colors[i])
ax.add_artist(circle)
plt.show()
如果您需要补丁:
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.patches import Polygon
from matplotlib.collections import PatchCollection
r = np.arange(1, 0, -0.1)
fig, ax = plt.subplots(1)
ax.set_xlim([-1.1, 1.1])
ax.set_ylim([-1.1, 1.1])
patches = []
colors = np.array([0.9, 0.8, 0.1, 0.1, 0.1, 0.4, 0.2, 0.8, 0.1, 0.9])
phi = np.linspace(0, 2*np.pi, 200)
for radius in r:
x = radius * np.cos(phi)
y = radius * np.sin(phi)
points = np.vstack([x, y]).T
polygon = Polygon(points, False)
patches.append(polygon)
p = PatchCollection(patches, cmap="Blues")
p.set_array(colors)
ax.add_collection(p)
plt.show()