如何修改matplotlib中Patch的zorder?如何绘制完全不透明蓝色填充圆?
问题描述
- 尝试用matplotlib绘制完全不透明的蓝色填充圆形,但绘制出的圆形呈透明状态,如何实现完全不透明的蓝色填充圆?
- 如何修改matplotlib中Patch的zorder?
用户代码如下:
from numpy import * import matplotlib.pyplot as plt import matplotlib.patches as pat fig, ax = plt.subplots() a=2 b=1.5 def cell(x,y): X=array([x,x+a/6,x,x+(2/6)*a,x+a/6,x+a/3,x+a/2,x+a/6,x+a/2,x+a/3,x+a/2,x+a/2,x+(4/6)*a, x+(5/6)*a,x+a/2,x+a/2,x+(2/3)*a,x+(5/6)*a,x+a/2]) Y=array([y+b/4,y+b/2,y+0.75*b,y+b,y+b/2,y,y+b/4,y+b/2,y+0.75*b,y+b,y+0.75*b,y+b/4,y,y+b/2,y+b/4,y+0.75*b,y+b,y+b/2, y+0.75*b]) plt.plot(X,Y,c='black') plt.plot([x+(2/3)*a,x+a,x+(5/6)*a,x+a,x+(2/3)*a,x+a/3,x,x],[y+b,y+0.75*b,y+b/2,y+b/4,y,y,y+b/4,y+(3/4)*b],c='black') plt.plot([x+a/3,x+(2/3)*a],[y+b,y+b],c='black') plt.plot([x+a,x+a],[y+b/4,y+0.75*b],c='black') plt.plot([x+a/2,x+a/2],[y+0.75*b,y+b],c='black') plt.plot([x+(5/6)*a,x+a],[y+b/2,y+b/2],c='black') plt.plot([x,x+a/6],[y+b/2,y+b/2],c='black') plt.plot([x+a/2,x+a/2],[y,y+b/4],c='black') plt.plot([x+a,x+a],[y+0.75*b,y+b],c='black') plt.plot([x+a,x+a],[y,y+0.25*b],c='black') plt.plot([x,x],[y,y+0.25*b],c='black') plt.plot([x,x],[y+0.75*b,y+b],c='black') ax.add_patch(plt.Circle((x,y+0.75*b),radius=0.1,fc='blue')) ax.add_patch(plt.Circle((x,y+0.25*b),radius=0.1,fc='blue')) plt.arrow(-a/4,0.75*b,1.75,0,head_width=0.05,color='red') plt.arrow(-a/4,0.75*b,0,1.75,head_width=0.05,color='red') #C1=plt.Circle((0,0),radius=0.2,color='red') #ax.add_patch(C1) cell(0,0) cell(-2,0) cell(0,1.5) cell(-2,1.5) plt.text(-a/4-0.1,0.75*b-0.1,'O',color='red') plt.text(-a/4+0.05,2.6,r'$k_y$',color='red') plt.text(0.6,1,r'$k_x$',color='red')
输出效果:蓝色圆形被黑色线条覆盖,看起来呈半透明状态。
解决方案
1. 实现完全不透明的蓝色填充圆
你的圆形看起来“透明”,本质是圆形被后续绘制的黑色线条覆盖,而非真的透明度问题。matplotlib中,plot绘制的线条默认zorder为2,而Patch(如Circle)默认zorder为1,先添加的Circle会被后画的线条挡住。
有两种解决方法:
方法一:调整绘制顺序
在cell函数中,先添加圆形补丁,再绘制所有黑色线条:
def cell(x,y): # 先添加圆形 ax.add_patch(plt.Circle((x,y+0.75*b),radius=0.1,fc='blue')) ax.add_patch(plt.Circle((x,y+0.25*b),radius=0.1,fc='blue')) # 再绘制所有线条 X=array([x,x+a/6,x,x+(2/6)*a,x+a/6,x+a/3,x+a/2,x+a/6,x+a/2,x+a/3,x+a/2,x+a/2,x+(4/6)*a, x+(5/6)*a,x+a/2,x+a/2,x+(2/3)*a,x+(5/6)*a,x+a/2]) Y=array([y+b/4,y+b/2,y+0.75*b,y+b,y+b/2,y,y+b/4,y+b/2,y+0.75*b,y+b,y+0.75*b,y+b/4,y,y+b/2,y+b/4,y+0.75*b,y+b,y+b/2, y+0.75*b]) plt.plot(X,Y,c='black') # 后续所有plot代码...
方法二:提高圆形的zorder
创建Circle时指定更高的zorder参数,让圆形显示在线条上方:
ax.add_patch(plt.Circle((x,y+0.75*b),radius=0.1,fc='blue', zorder=3)) ax.add_patch(plt.Circle((x,y+0.25*b),radius=0.1,fc='blue', zorder=3))
只要zorder值大于线条的默认值2,圆形就会覆盖在线条之上,呈现完全不透明的蓝色。
2. 修改matplotlib中Patch的zorder
修改Patch的zorder有两种方式:
- 创建时指定:初始化Patch对象(如Circle、Rectangle等)时,直接传入
zorder参数:circle = plt.Circle((x,y), radius=0.1, fc='blue', zorder=5) ax.add_patch(circle) - 创建后修改:通过Patch对象的
set_zorder()方法调整:circle = plt.Circle((x,y), radius=0.1, fc='blue') circle.set_zorder(5) ax.add_patch(circle)
zorder值越大,元素显示层级越高,会覆盖在zorder值小的元素之上。
内容的提问来源于stack exchange,提问作者Ali Rayat
相关产品推荐
相关产品推荐

