我绘制了一组填充颜色的圆圈,其中一些具有重叠区域(有时是多个重叠区域)。我希望能够用自己指定的不同颜色填充重叠部分。
例如,如果我有一个重叠的红色和蓝色圆圈,我希望中间区域(即“镜头”)以白色绘制。像这样的东西:
我该怎么做?我尝试过绘制散点图并为标记设置较低的 Alpha,但重叠区域中的颜色只是圆圈颜色的平均值,我希望能够控制这些重叠区域中的确切颜色。
请记住,有时我有几个重叠,所以我也希望能够独立地为它们着色(例如选择维恩图中集合的交集)。
我可以想到两种方法。第一个是我最喜欢的,我们生成随机数并检查它们是否在所需的范围内。您可以在这里定义几乎所有内容:
import random
import matplotlib.pyplot as plt
x1, y1, x2, y2, x3, y3 = [], [], [], [], [], []
r = 1 # Radius
n = 400 # Number of generated points
for i in range(n):
for j in range(n):
rx = random.uniform(-r, r)
ry = random.uniform(-r, r)
if rx**2 + ry**2 < r**2:
# Circle 1
x1.append(rx)
y1.append(ry)
# Circle 2
x2.append(rx + 1)
y2.append(ry - 0.25)
# Intersection
if (rx - 1) ** 2 + (ry + 0.25) ** 2 < r**2:
x3.append(rx)
y3.append(ry)
# Plot
fig, ax = plt.subplots()
plt.scatter(x1, y1, color='red')
plt.scatter(x2, y2, color='blue')
plt.scatter(x3, y3, color='white')
ax.set_facecolor('black')
ax.set_aspect(1)
plt.show()
n
以获得更平滑的曲线。您可以在 s
中定义并设置 plt.scatter
(标记大小)为较低值,以使曲线更加平滑,或者执行相反的操作,也许通过定义 alpha
您可以获得更真实的效果。为圆定义不同的半径。您可以轻松更改方程以获得不同的形状,例如椭圆形。
第二种方法是我不推荐的,但我想你可能会想看一下:
import matplotlib.pyplot as plt
import numpy as np
# Define the circle equation
r = 4
x = np.linspace(-r, r, 200)
y1 = np.sqrt(r**2 - x**2)
y2 = np.sqrt(r**2 - x**2)
y3 = np.sqrt(r**2 - x**2) + 3
y4 = np.sqrt(r**2 - x**2) - 3
# Plot
fig, ax = plt.subplots()
# circle 1
ax.plot(x-2., y1, linewidth=0.2)
ax.plot(x-2, -y1, linewidth=0.2)
# circle 2
ax.plot(x+2, y2, linewidth=0.2)
ax.plot(x+2, -y2, linewidth=0.2)
# circle 3
ax.plot(x, y3, linewidth=0.2)
ax.plot(x, -y4, linewidth=0.2)
ax.fill_between(x-2, 0, y1, linewidth=0, color = 'b', alpha=.4)
ax.fill_between(x-2, 0, -y1, linewidth=0, color = 'b', alpha=.4)
ax.fill_between(x+2, 0, y2, linewidth=0, color = 'r', alpha=.4)
ax.fill_between(x+2, 0, -y2, linewidth=0, color = 'r', alpha=.4)
ax.fill_between(x, 3, y3, linewidth=0, color = 'limegreen', alpha=.4)
ax.fill_between(x, 3, -y4, linewidth=0, color = 'limegreen', alpha=.4)
ax.set_aspect(1)
plt.show()