matplotlib 带 alpha 的圆形补丁会产生边缘和面颜色的重叠

2024-01-02

一般来说,我对 matplotlib 和 python 相当陌生,我想做的事情相当基本。然而,即使经过相当长的谷歌搜索时间,我也找不到解决方案:

问题是这样的:

我想画一个边框和脸部颜色不同的圆圈,即设置edgecolor and facecolor不同。我还想要一个 alpha 通道,即alpha=0.5。现在,虽然所有这些工作正常,但生成的圆没有单一边框颜色,而是绘制了 2 个边框。一,外层,采用我指定的颜色edgecolor另一个颜色我认为是边缘颜色和面部颜色的组合。

这是我的代码:

from matplotlib import pyplot as plt
point = (1.0, 1.0)
c = plt.Circle(point, 1, facecolor='green', edgecolor='orange', linewidth=15.0, alpha=0.5)
fig, ax = plt.subplots()
ax.add_artist(c)
plt.show()

这是一个例子:

好吧,这可能是一件小事,但是这第二个边界让我发疯!

难道我做错了什么?事情就是这样吗?任何帮助将非常感激。


在某种程度上,是的,事情就是这样。 重点是边缘实际上是在圆的边缘上绘制的。 这意味着边缘宽度的一半绘制在圆表面的顶部,另一半绘制在外部。如果现在你设置alpha<1.0正如您正确得出的结论,您会看到面部颜色和边缘颜色的重叠。

然而,你可以摆脱那个“额外的边界”。以下是两种方法,哪一种最适合您取决于您​​到底想做什么。

第一个建议:

恕我直言,最简单的是只为facecolor。这可以通过设置 alpha 通道来完成facecolor直接并省略alpha呼吁中的论点Circle。您可以使用以下命令设置 alpha 通道colorConverter:

from matplotlib.colors import colorConverter
import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(8, 8))
ax.axis('equal')
ax.set_xlim(0,1)
ax.set_ylim(0,1)
# Here you set alpha for the faceolor
fc = colorConverter.to_rgba('green', alpha=0.5)
point = (1.0, 1.0)
r = 1.0
lw = 15.0
ec = 'orange'
# NOTE: do not set alpha when calling Circle!
c = plt.Circle(point, r,fc=fc, ec=ec, lw=lw)
ax.add_artist(c)
plt.show()

第二个建议

更详细的选项是在仅绘制面后用白色边缘“擦拭”圆的边缘,然后仅绘制边缘。 通过这种方法,两种颜色都随 Alpha 通道一起出现。但请注意,在这种情况下,位于边缘“下方”的任何对象都将被边缘完全遮盖:

import matplotlib.pyplot as plt
from matplotlib.collections import PatchCollection

point = (1.0, 1.0)
r = 1.0
alpha = 0.5
lw = 15.0
fc = 'green'
ec = 'orange'
# First only draw the facecolor
c_face = plt.Circle(point, r, alpha=alpha, fc=fc, lw=0.0)
# Draw a non-transparent white edge to wipe the facecolor where they overlap
c_wipe = plt.Circle(point, r, alpha=1.0, ec='white', fc='none', lw=lw)
# Now draw only the edge
c_edge = plt.Circle(point, r, alpha=alpha, fc='none', ec=ec, lw=lw)
circle_patch = PatchCollection([c_face, c_wipe, c_edge], match_original=True)
fig, ax = plt.subplots(figsize=(8, 8))
ax.axis('equal')
ax.set_xlim(0,1)
ax.set_ylim(0,1)
ax.add_artist(circle_patch)
plt.show()

这是一个要点 https://gist.github.com/j-i-l/a88720d934b921a9338030a55dced2d1根据第二个建议处理这个问题。只需下载mod_patch.py https://gist.github.com/j-i-l/a88720d934b921a9338030a55dced2d1#file-mod_patch-py文件然后就可以走了。

以下是它的使用方法:

import matplotlib.pyplot as plt
from mod_patch import get_Patch
fig, ax = plt.subplots(figsize=(8,8))
c = get_Patch(plt.Circle, (0,0.5), 0.5, facecolor='green', edgecolor='orange', alpha=0.5, lw=15)
ax.add_artist(c)
r = get_Patch(plt.Rectangle, (0.5,0), 0.5, 0.5, facecolor='green', edgecolor='orange', alpha=0.5, lw=15)
ax.add_artist(r)
plt.show()

为了完整起见,这里定义get_Patch:

from matplotlib.collections import PatchCollection


def get_Patch(a_Patch, *args, **kwargs):
    background_color = kwargs.pop(
        'bgc',
        kwargs.pop('background_color', 'white')
    )
    alpha = kwargs.get('alpha', 1.0)
    patches = []
    lw = kwargs.get('lw', kwargs.get('linewidth', 0.0))
    if alpha < 1.0 and lw:
        color = kwargs.get('c', kwargs.get('color', None))
        fc = kwargs.get('facecolor', kwargs.get('fc', None))
        ec = kwargs.get('edgecolor', kwargs.get('ec', None))
        face_kwargs = dict(kwargs)
        face_kwargs['fc'] = fc if fc is not None else color
        face_kwargs['lw'] = 0.0
        p_face = a_Patch(*args, **face_kwargs)
        patches.append(p_face)
        wipe_kwargs = dict(kwargs)
        wipe_kwargs['fc'] = 'none'
        wipe_kwargs['ec'] = background_color
        wipe_kwargs['alpha'] = 1.0
        p_wipe = a_Patch(*args, **wipe_kwargs)
        patches.append(p_wipe)
        edge_kwargs = dict(kwargs)
        edge_kwargs['fc'] = 'none'
        edge_kwargs['ec'] = ec if ec is not None else color
        p_edge = a_Patch(*args, **edge_kwargs)
        patches.append(p_edge)
    else:
        p_simple = a_Patch(*args, **kwargs)
        patches.append(p_simple)
    return PatchCollection(patches, match_original=True)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

matplotlib 带 alpha 的圆形补丁会产生边缘和面颜色的重叠 的相关文章

  • 出现导入错误:无法从“随机”导入名称“随机”[重复]

    这个问题在这里已经有答案了 我在我的计算机上多次运行我的代码 但没有出现此错误 但突然间这个来了 File e Python 3 8 0 lib site packages comtypes client code cache py lin
  • 对 Python DataFrame 进行子集化

    我正在从 R 过渡到 Python 我刚刚开始使用 Pandas 我有一个可以很好地子集化的 R 代码 k1 lt subset data Product p id Month lt mn Year yr select c Time Pro
  • 计算温度的偏导数(温度的水平平流)

    我想知道哪种方法计算x和y方向温度的偏导数 温度的水平平流 最正确 第二个代码使用温度 纬向风和经向风的数据矩阵 提取温度 T 纬向风分量 u 和经向风分量 v 的数据 import matplotlib pyplot as plt imp
  • Python中使用cv2获取当前视频播放位置

    我正在尝试使用 CV2 和 Python 从播放视频中获取当前播放时间位置 如果可能 以毫秒为单位 目前我正在使用此示例代码来播放视频文件 import cv2 import numpy as np file name 2 mp4 wind
  • 在 python + Flask + Gunicorn + nginx + Compute Engine 应用程序中从 Google Cloud Storage 读取文件失败

    在 python Flask Gunicorn nginx Compute Engine 应用程序中读取从 Google Cloud Storage 下载的文件失败 代码链接 https github com samuq CE test h
  • Python MySQL 模块

    我正在开发一个需要与 MySQL 数据库交互的 Web 应用程序 但我似乎找不到任何真正适合 Python 的模块 我特别寻找快速模块 能够处理数十万个连接 和查询 所有这些都在短时间内完成 而不会对速度产生重大影响 我想我的答案将是游戏领
  • numpy 数组最快的保存和加载选项

    我有一个生成二维的脚本numpy数组与dtype float和形状的顺序 1e3 1e6 现在我正在使用np save and np load对数组执行 IO 操作 然而 这些函数对于每个数组都需要几秒钟的时间 是否有更快的方法来保存和加载
  • 使用子图绘制 pandas 数据框 (subplots=True):放置图例并使用紧凑的布局

    我真的很喜欢 pandas 来处理和分析大数据集 到目前为止 我主要使用 matplotlib 进行绘图 但现在想使用 pandas 自己的绘图功能 基于 matplotlib 因为它需要更少的代码 并且在大多数情况下对我来说似乎足够了 尤
  • 如何在树莓派上更新到最新的 python 3.5.1 版本?

    我昨天拿到了 Raspberry Pi 我已经在尝试用它来编写代码了 我有一个计划在其上运行的程序 但它仅与 Python 版本 3 5 0 或 3 5 1 兼容 并且我在互联网上找到的所有内容似乎都已经过时 与 Python 2 有关 或
  • 多线程写入文件

    前几天刚开始使用 python 对多线程的整个概念还很陌生 我在多线程时写入文件时遇到问题 如果我按照常规方式执行此操作 它会不断覆盖正在写入的内容 使用 5 个线程写入文件的正确方法是什么 不降低性能的最佳方法是在所有线程之间使用队列 每
  • Python unittest - 与assertRaises相反?

    我想编写一个测试来确定在给定情况下不会引发异常 测试是否有异常很简单is上调 sInvalidPath AlwaysSuppliesAnInvalidPath self assertRaises PathIsNotAValidOne MyO
  • 在Python中引用不带换行符的长字符串

    我正在尝试在 Python 中编写一个长字符串 该字符串显示为 OptParser 选项的帮助项 在我的源代码 py 文件中 我想放置换行符 以便我的代码不会花费新行 但是 我不希望这些换行符影响代码运行时该字符串的显示方式 例如 我想写
  • 收到的标签值 1 超出了 [0, 1) 的有效范围 - Python、Keras

    我正在使用具有张量流背景的 keras 开发一个简单的 cnn 分类器 def cnnKeras training data training labels test data test labels n dim print Initiat
  • Python 类方法的示例用例是什么?

    我读了Python 中的类方法有什么用 https stackoverflow com questions 38238 what are class methods in python for但那篇文章中的例子很复杂 我正在寻找 Pytho
  • python 函数返回 javascript date.getTime()

    我正在尝试创建一个简单的 python 函数 它将返回与 javascript 相同的值new Date getTime 方法 如所写here http www w3schools com js js dates asp javascrip
  • 在字典理解中为 locals() 添加下标失败并出现 KeyError [重复]

    这个问题在这里已经有答案了 我对 Python 的奇怪行为感到困惑locals 基本上我想从字典中获取一个项目locals 在字典理解中 但它失败了 这是一个非常基本的事情 所以 gt gt gt foo 123 gt gt gt bar
  • 如何从python导入路径中删除当前目录

    我想使用 Mercurial 存储库hg本身 也就是说 我克隆了 Mercurialhttps www mercurial scm org repo hg https www mercurial scm org repo hg并想运行一些h
  • 使用 Pandas 和 Group By 绘制堆叠直方图

    我正在使用如下所示的数据集 Gender Height Width Male 23 4 4 4 Female 45 4 4 5 我想可视化高度和宽度的堆叠直方图 我希望每个图有两个堆叠的直方图 每个性别一个 这是文档中的堆叠直方图 如果存在
  • 连接运算符 + 或 ,

    var1 abc var2 xyz print literal var1 var2 literalabcxyz print literal var1 var2 literal abc xyz 除了带有 的自动空格之外 两者有什么区别 哪个通
  • Python列表问题

    我在使用 python 列表时遇到问题 简化版本是 mylist1 some items in a list mylist2 mylist1 mylist1 pop i mylist insert i item print mylist1

随机推荐

  • 使用 xcode 8 将字典保存在 swift 3 的 userdefaults 中

    我使用以下代码使用 xcode 8 将对象保存到 UserDefaults 以前称为 NSUserDefaults let defaults UserDefaults standard defaults set someObject for
  • 可以使用条件来确定泛型的类型吗?

    在讨论这个问题之前 我将首先解释我想要做什么以及我是如何陷入困境的 作为我自己的学习练习 我解决了一些已经在 Objective C 中解决的问题 看看如何使用 Swift 以不同的方式解决它们 我遇到的具体情况是一个小片段 它捕获更改之前
  • Mathematica:将参数的默认值设置为非常量?

    我可以将函数参数的默认值设置为某个值吗 那不是恒定的吗 例子 tod Mod AbsoluteTime 86400 f x tod x 在上面 tod 每次评估时都会改变 但 f 却会改变 不是 f 产生 f x 42054 435657
  • React 生产和 Cookie 问题

    我开发了一个 React 应用程序和一个 Express API 本地主机中的一切都工作正常 我将 API 移至 digitalocean Droplet 它只是 IP 地址 而且是 HTTP 当我在开发环境中使用 React 应用程序的
  • 当 url 无效时,webrequest.begingetresponse 花费太多时间

    我正在使用 webrequest 来获取一些图像数据 网址有时可能无效 如果 URL 无效 begingetresponse 所花费的时间等于超时时间 在此期间 控件也会变得无响应 换句话说 异步回调不是异步工作的 这是预期的行为吗 try
  • NLog 未在所有级别上记录日志

    ASPNET Core 2 0 与最新的 Nlog 所有配置文件均正确加载 我的配置文件很简单 我只是希望它记录所有内容
  • 如何修复 Azure CI 上的控制台日志编码问题?

    当我在发布管道的 docker 容器中运行 Cypress 时 我在 Azure CI 上得到了这个信息 我猜这可能是因为 Cypress docker NodeJS 或 CI 本身的某些设置 https i stack imgur com
  • 无法在 App Engine Python 上通过 Cloud SQL 使用 utf8mb4 字符集

    我已经设置了一个 CloudSQL 实例 尝试将其与 AppEngine 上的 Django 应用程序一起使用 我已确认服务器已设置为使用utf8mb4通过 CloudSQL 控制台为我的数据库设置字符集 utf8mb4 utf8mb4 u
  • 具有 Windows 身份验证的 ASP.NET 角色

    来自 ASP 新手的超级简单问题 我正在开发一个内部专用的 ASP NET 网站 该网站全面使用 Windows 集成身份验证 我想将三个角色与该站点关联 用户 经理和管理员 该网站向整个组织开放 因此任何经过身份验证的人都是用户 除非他们
  • 如何在android中读取xmpp消息标签的自定义属性?

    我需要接收的 xml 是
  • 在 Swift 中计算预计到达时间

    我试图快速计算两个位置之间的估计旅行时间 步行 用户进行注释 这是我当前的代码 它不会引发任何导致程序崩溃的错误 而只会返回 请求 ETA 时出错 import UIKit import MapKit class LocationObjec
  • 解析php中的URL

    在 php 中 如果我想解析一个 URL 例如 www site com index php foo bar 我可以使用 POST 变量 我可以找回bar by POST foo 但如果我的网址是这样的怎么办www site com ind
  • 如何生成 rdoc 风格的可折叠代码段?

    我正在使用 Doxygen 为 C 项目创建内部文档 我让 Doxygen 包含方法的源代码等 但这使得页面难以扫描 我希望它的行为像 rdoc 一样 并将源代码隐藏在默认折叠的块中 我以为HTML DYNAMIC SECTIONS可能会让
  • 有没有办法从重载的 TS 方法中提取所有函数签名?

    基本上我只是想包装一个具有多个签名的函数 有没有什么干净的方法可以做到这一点 而无需重新硬编码所有签名 我只是想bar下面接受任何相同的参数foo declare function foo x string number declare f
  • 如何调试 AngularJS 中的“10 $digest iterations returned”错误?

    正常情况下 该消息Watchers fired in the last 5 iterations 可能包含有用的提示 但正如您所看到的 它是空的 类似问题的大多数其他答案都会告诉您寻找一种为每次调用返回一个新对象的方法 但这在大型应用程序中
  • Windbg:命令输出到文本文件

    如何将 WinDbg 中命令的输出保存到文本文件 使用 logo 选项从命令行启动 WinDbg windbg exe logo logfile txt 这将使所有完成的事情记录到指定的文件中 您可以找到命令行选项的更多详细信息here h
  • Emacs 正则表达式中字符串的开头和结尾

    表示开头和结尾的字符是什么string其中有换行符吗 我正在编写一个修剪函数 defun trim str if string match space space str match string 1 str str 但是使用像 first
  • Angular 5:如何在子组件中获取父组件路由参数?

    Here is add new folder component 该组件是以下组件的子组件folder component当我路由add new folder component from folder component那个时候我想要fo
  • 生成随机密钥 firestore

    我正在运行一个火存储数据库 我想创建一个随机密钥与 firestore 相同的模式 在链接中 我找到了创建文档后调用的函数 with db ref add 在客户端生成密钥 https github com firebase firebas
  • matplotlib 带 alpha 的圆形补丁会产生边缘和面颜色的重叠

    一般来说 我对 matplotlib 和 python 相当陌生 我想做的事情相当基本 然而 即使经过相当长的谷歌搜索时间 我也找不到解决方案 问题是这样的 我想画一个边框和脸部颜色不同的圆圈 即设置edgecolor and faceco