在 Matplotlib 中着色 Circles/Patches 的交叉点
Coloring Intersection of Circles/Patches in Matplotlib
以下代码:
# 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)每个单独的事件(non-overlapping 区域,当前为蓝色和红色),以及(4) 路口事件(目前混合为紫色)。例如,我可以给它们涂上红色、绿色、蓝色、黄色 - 或者 - 我可以给它们四个不同的、精确指定的灰度值(后者更有可能)。 [颜色将根据基础数据的特征生成。]
我特别不想对 "infer" 相交处的颜色使用 alpha 混合。我需要明确控制所有四个区域的颜色。
我能想到一些解决这个问题的策略:
- 要求 mpl 提取 "primitive" 组成三个颜色不同的图形区域的补丁对象(并做一些类似于对背景进行操作的操作),然后为它们着色。
- 给定圆圈,手动计算它们的交点并为该交点着色(以某种方式)。一点一点的去,好像很难看。
谢谢!
我不是 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()
以下代码:
# 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)每个单独的事件(non-overlapping 区域,当前为蓝色和红色),以及(4) 路口事件(目前混合为紫色)。例如,我可以给它们涂上红色、绿色、蓝色、黄色 - 或者 - 我可以给它们四个不同的、精确指定的灰度值(后者更有可能)。 [颜色将根据基础数据的特征生成。]
我特别不想对 "infer" 相交处的颜色使用 alpha 混合。我需要明确控制所有四个区域的颜色。
我能想到一些解决这个问题的策略:
- 要求 mpl 提取 "primitive" 组成三个颜色不同的图形区域的补丁对象(并做一些类似于对背景进行操作的操作),然后为它们着色。
- 给定圆圈,手动计算它们的交点并为该交点着色(以某种方式)。一点一点的去,好像很难看。
谢谢!
我不是 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()