You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 22:15:27