Matplotlib中圆/曲面的求交着色

jjjwad0x  于 2023-02-23  发布在  其他
关注(0)|答案(1)|浏览(127)

下面的代码:

# in ipython notebook, enable inline plotting with:
# %pylab inline --no-import-all
import matplotlib.pyplot as plt

# create some circles
circle1 = plt.Circle((-.5,0), 1, color='r', alpha=.2)
circle2 = plt.Circle(( .5,0), 1, color='b', alpha=.2)

# add them to the plot (bad form to use ;, but saving space)
# and control the display a bit
ax = plt.gca()
ax.add_artist(circle1); ax.add_artist(circle2)
ax.set_xlim(-2, 2); ax.set_ylim(-2, 2)
ax.set_aspect('equal')

# display it
plt.plot()

生成以下图:

我想指定四个区域的颜色(1)背景(当前为白色),(2和3)每个单项事件(非重叠区域,当前为蓝色和红色),以及(4)路口事件(目前混合成紫色)。例如,我可能会把它们涂成红色,绿色,蓝色,黄色-或者-我可能会给它们四种不同的,精确指定的灰度值(后者更有可能)。[颜色将基于底层数据的特征生成。]
我特别不想使用alpha混合来"推断"交集中的颜色。我需要显式地控制所有四个区域的颜色。
我可以想出几个策略来解决这个问题:

  • 让mpl提取组成三个不同颜色的图形区域的"原始"面片对象(并对背景进行类似的操作),然后给它们着色。
  • 给出圆,手动计算它们的交点并给交点着色(不知何故)。逐点进行似乎很难看。

谢谢!

sr4lhrrt

sr4lhrrt1#

我不是100%确定,但是我认为matplotlib没有多边形相交的功能,但是你可以使用shapely

import shapely.geometry as sg
import matplotlib.pyplot as plt
import descartes

# create the circles with shapely
a = sg.Point(-.5,0).buffer(1.)
b = sg.Point(0.5,0).buffer(1.)

# compute the 3 parts
left = a.difference(b)
right = b.difference(a)
middle = a.intersection(b)

# use descartes to create the matplotlib patches
ax = plt.gca()
ax.add_patch(descartes.PolygonPatch(left, fc='b', ec='k', alpha=0.2))
ax.add_patch(descartes.PolygonPatch(right, fc='r', ec='k', alpha=0.2))
ax.add_patch(descartes.PolygonPatch(middle, fc='g', ec='k', alpha=0.2))

# control display
ax.set_xlim(-2, 2); ax.set_ylim(-2, 2)
ax.set_aspect('equal')
plt.show()

相关问题