如何在 matplotlib 中为重叠的圆圈着色?

问题描述 投票:0回答:1

我绘制了一组填充颜色的圆圈,其中一些具有重叠区域(有时是多个重叠区域)。我希望能够用自己指定的不同颜色填充重叠部分。

例如,如果我有一个重叠的红色和蓝色圆圈,我希望中间区域(即“镜头”)以白色绘制。像这样的东西:

我该怎么做?我尝试过绘制散点图并为标记设置较低的 Alpha,但重叠区域中的颜色只是圆圈颜色的平均值,我希望能够控制这些重叠区域中的确切颜色。

请记住,有时我有几个重叠,所以我也希望能够独立地为它们着色(例如选择维恩图中集合的交集)。

python matplotlib colors geometry
1个回答
0
投票

我可以想到两种方法。第一个是我最喜欢的,我们生成随机数并检查它们是否在所需的范围内。您可以在这里定义几乎所有内容:

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

在这里您无法定义相交颜色,因为它们取决于圆圈。

© www.soinside.com 2019 - 2024. All rights reserved.