根据函数

时间:2016-08-28 20:36:06

标签: python matplotlib plot

对网站来说是全新的,对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

  1. 我想知道为什么右边有这条水平线,这让我相信我不明白我的代码是做什么的。
  2. 由于所有的环段都具有相同的颜色而不是具有不同的阴影,所以它没有完成这个技巧。
  3. 我想到了     p.set_array(颜色) 我会在example中找到它 即使我不知道 set_array()作为文档做什么 并没有放弃很多。

    如果有完全不同的方法,请随时告诉我。

1 个答案:

答案 0 :(得分:1)

您需要添加从最大到最小的圆圈,这样它们就不会相互重叠。

我使用了plot a circle with pyplothttp://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()