在 matplotlib 中围绕散点图中的数据点绘制平滑的多边形

2023-11-21

我有一堆带有两组数据的交叉图,并且一直在寻找一种 matplotlib 方法来用平滑的多边形轮廓突出显示它们的绘制区域。

At the moment i just use Adobe Illustrator and amend saved plot, but this is not ideal. Example:enter image description here

如果有任何示例的指针/链接,我将不胜感激。

Cheers


在这里,你有一个例子。我写下了主要想法,但显然,你可以做得更好。

简短的解释:

1)您需要计算凸包(http://en.wikipedia.org/wiki/Convex_hull)

2)有了船体,您可以扩展它以将所有数据保存在里面。

3) 您必须对结果曲线进行插值。

第一部分完成于http://wiki.scipy.org/Cookbook/Finding_Convex_Hull。第二个是微不足道的。第三种方法非常通用,您可以执行任何方法,有很多不同的方法可以执行相同的操作。我采用了@Jaime 的方法(任意轮廓的平滑样条表示,f(length) --> x,y),我认为这是一个非常好的方法。

我希望它能帮助你...

#Taken from http://wiki.scipy.org/Cookbook/Finding_Convex_Hull

import numpy as n, pylab as p, time

def _angle_to_point(point, centre):
    '''calculate angle in 2-D between points and x axis'''
    delta = point - centre
    res = n.arctan(delta[1] / delta[0])
    if delta[0] < 0:
        res += n.pi
    return res

def _draw_triangle(p1, p2, p3, **kwargs):
    tmp = n.vstack((p1,p2,p3))
    x,y = [x[0] for x in zip(tmp.transpose())]
    p.fill(x,y, **kwargs)

def area_of_triangle(p1, p2, p3):
    '''calculate area of any triangle given co-ordinates of the corners'''
    return n.linalg.norm(n.cross((p2 - p1), (p3 - p1)))/2.


def convex_hull(points, graphic=False, smidgen=0.0075):
    '''
    Calculate subset of points that make a convex hull around points
    Recursively eliminates points that lie inside two neighbouring points until only convex hull is remaining.

    :Parameters:
    points : ndarray (2 x m)
    array of points for which to find hull
    graphic : bool
    use pylab to show progress?
    smidgen : float
    offset for graphic number labels - useful values depend on your data range

    :Returns:
    hull_points : ndarray (2 x n)
    convex hull surrounding points
    '''

    if graphic:
        p.clf()
        p.plot(points[0], points[1], 'ro')
    n_pts = points.shape[1]
    assert(n_pts > 5)
    centre = points.mean(1)
    if graphic: p.plot((centre[0],),(centre[1],),'bo')
    angles = n.apply_along_axis(_angle_to_point, 0, points, centre)
    pts_ord = points[:,angles.argsort()]
    if graphic:
        for i in xrange(n_pts):
            p.text(pts_ord[0,i] + smidgen, pts_ord[1,i] + smidgen, \
                   '%d' % i)
    pts = [x[0] for x in zip(pts_ord.transpose())]
    prev_pts = len(pts) + 1
    k = 0
    while prev_pts > n_pts:
        prev_pts = n_pts
        n_pts = len(pts)
        if graphic: p.gca().patches = []
        i = -2
        while i < (n_pts - 2):
            Aij = area_of_triangle(centre, pts[i],     pts[(i + 1) % n_pts])
            Ajk = area_of_triangle(centre, pts[(i + 1) % n_pts], \
                                   pts[(i + 2) % n_pts])
            Aik = area_of_triangle(centre, pts[i],     pts[(i + 2) % n_pts])
            if graphic:
                _draw_triangle(centre, pts[i], pts[(i + 1) % n_pts], \
                               facecolor='blue', alpha = 0.2)
                _draw_triangle(centre, pts[(i + 1) % n_pts], \
                               pts[(i + 2) % n_pts], \
                               facecolor='green', alpha = 0.2)
                _draw_triangle(centre, pts[i], pts[(i + 2) % n_pts], \
                               facecolor='red', alpha = 0.2)
            if Aij + Ajk < Aik:
                if graphic: p.plot((pts[i + 1][0],),(pts[i + 1][1],),'go')
                del pts[i+1]
            i += 1
            n_pts = len(pts)
        k += 1
    return n.asarray(pts)

if __name__ == "__main__":

    import scipy.interpolate as interpolate

#    fig = p.figure(figsize=(10,10))

    theta = 2*n.pi*n.random.rand(1000)
    r = n.random.rand(1000)**0.5
    x,y = r*p.cos(theta),r*p.sin(theta)

    points = n.ndarray((2,len(x)))
    points[0,:],points[1,:] = x,y

    scale = 1.03
    hull_pts = scale*convex_hull(points)

    p.plot(x,y,'ko')

    x,y = [],[]
    convex = scale*hull_pts
    for point in convex:
        x.append(point[0])
        y.append(point[1])
    x.append(convex[0][0])
    y.append(convex[0][1])

    x,y = n.array(x),n.array(y)

#Taken from https://stackoverflow.com/questions/14344099/numpy-scipy-smooth-spline-representation-of-an-arbitrary-contour-flength
    nt = n.linspace(0, 1, 100)
    t = n.zeros(x.shape)
    t[1:] = n.sqrt((x[1:] - x[:-1])**2 + (y[1:] - y[:-1])**2)
    t = n.cumsum(t)
    t /= t[-1]
    x2 = interpolate.spline(t, x, nt)
    y2 = interpolate.spline(t, y, nt)
    p.plot(x2, y2,'r--',linewidth=2)

    p.show()

enter image description here

有一些有用的论文,例如:

http://repositorium.sdum.uminho.pt/bitstream/1822/6429/1/ConcaveHull_ACM_MYS.pdf

另外,您可以尝试:http://resources.arcgis.com/en/help/main/10.1/index.html#//007000000013000000

我对arcgis一无所知,但看起来不错。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 matplotlib 中围绕散点图中的数据点绘制平滑的多边形 的相关文章

  • ptb_word_lm中batch_size的含义(tensorflow的LSTM模型)

    我是张量流的新手 我现在对它的含义有点困惑batch size 众所周知 其含义是batch size是每批次的样本数 但是根据中的代码ptb word lm 似乎不是 读者 py data len tf size raw data the
  • 如何使用 lstm 执行多类多输出分类

    I have multiclass multioutput classification see https scikit learn org stable modules multiclass html https scikit lear
  • 如何在Python中获得更精确的十进制值[重复]

    这个问题在这里已经有答案了 from math import sqrt a 1e 8 b 10 c 1e 8 x1 b sqrt b 2 4 a c 2 a x2 b sqrt b 2 4 a c 2 a print x1 format x
  • pandas:使用运算符链接过滤 DataFrame 的行

    大多数业务在pandas可以通过操作符链接来完成 groupby aggregate apply等 但我发现过滤行的唯一方法是通过普通的括号索引 df filtered df df column value 这没有吸引力 因为它需要我分配d
  • 如果新文件不存在则写入新文件,如果存在则追加到文件

    我有一个程序可以写入用户的highscore到一个文本文件 该文件由用户选择时命名playername 如果具有该特定用户名的文件已经存在 那么程序应该附加到该文件 以便您可以看到多个highscore 如果具有该用户名的文件不存在 例如
  • 如何在 django 表单中设置自定义 HTML 属性?

    我有一个 Django 表单 它是页面的一部分 假设我有一个字段 search input forms CharField u Search word required False 我只能通过模板访问它 form search input
  • Plotly - 不同颜色的表面

    我正在尝试在 Plotly for Python 中绘制多个曲面 每个曲面具有不同的颜色 具体来说 表面显示了在相空间中不同点采取行动的预测奖励函数 由于我在每个点都有多个可能的操作 因此每个点都是不同的表面 我想对每个表面进行独特的着色
  • PySerial 和多个 Python 安装出现问题

    我的 Windows 7 计算机上有 Python 2 4 4 和 3 1 3 我想使用 PySerial 听说是内置的 所以我尝试了一下import serial在两个版本中 两者都造成了Import Error 然后我从以下位置下载了w
  • 使用 selenium 在 python 中切换到弹出窗口

    如何在下面的 selenium 程序中切换到弹出窗口 我已经查找了所有可能的解决方案 但无法解决它们 请帮忙 from selenium import webdriver from splinter import Browser from
  • 在OpenCV Python中编写4通道以上图像

    这对我来说是一个持续的挑战 我正在尝试使用 openCV 将两个 3 RGB 图像组合成一个 6 通道 TIFF 图像 到目前为止我的代码如下 import cv2 import numpy as np im1 cv2 imread im1
  • python请求:重试直到收到有效响应

    我想知道是否存在重试请求一定次数的常见模式 可能由于服务器错误或网络不良而失败 我想出了这个 并且我愿意在那里找到更好的实现 cnt 0 while cnt lt 3 try response requests get uri if res
  • 如何在Python模拟中调用模拟方法

    我想创建一个模拟方法来调用被模拟的底层方法 我正在想象类似以下的内容 但我找不到任何有关模拟对象的文档 该对象包含对被模拟对象的引用 我将其表示为 wrapped method foo below from mock import patc
  • 如何在 PySide/PyQt 中制作一个位于屏幕中央的小部件?

    这段代码有效 但我想知道是否有更简单的方法 def center self qr self frameGeometry cp gui QDesktopWidget availableGeometry center qr moveCenter
  • Django外键:获取相关模型?

    是否可以通过外键字段本身获取外键的相关模型 例如 如果我有 3 个模型 class ModelA models Model field1 models CharField max length 10 class ModelB models
  • 如何使用 Python Flask-Security 使用 bcrypt 加密密码?

    我正在尝试使用 Flask Security 文档中的标准基本示例 并使其正常工作 除了密码以明文形式存储之外 我知道这一行 user datastore create user email email protected cdn cgi
  • 在 PyQt 中使用 Windows 7 任务栏功能

    我正在寻找有关将一些新的 Windows 7 任务栏功能集成到我的 PyQt 应用程序中的信息 具体来说 如果已经存在使用新进度指示器的可能性 see here http www petri co il wp content uploads
  • 导入pytorch时,未安装microsoft Visual C++ Redistributable

    我在一台带有 GPU 的 Windows 机器上工作 我已经在 conda 环境中安装了 pytorch conda install pytorch torchvision cudatoolkit 10 1 c pytorch 然后我运行
  • 纯Python库读写jpeg格式

    伙计们 我正在寻找 jpeg 写入 阅读会很好 但不是必需的 库的纯 python 实现 我只在以下位置创建了 TonyJPEG 库端口 http mail python org pipermail image sig 2004 Novem
  • 从 s3 获取 ogg 轨道的长度而不下载整个文件

    如何在不下载整个文件的情况下获取 ogg 文件的播放长度 我知道这是可能的 因为 HTML5 标签和 VLC 都可以在加载 URL 后立即显示整个播放长度 而无需下载整个文件 有标题或我可以阅读的内容吗 也许甚至是比特率 我可以将其除以文件
  • vtkPythonAlgorithm 控制管道执行

    我正在尝试用 python 编写一个 vtk 过滤器ProjectDepthImage进行投影不是问题 它控制 vtk 管道的执行 基本上 我对 UserEvent 有一个回调 当用户在渲染窗口处于活动状态时按下 u 键时会触发该回调 这将

随机推荐

  • TaskCreationOptions.AttachedToParent 不等待子任务

    根据 MSDN 您可以使用 AttachedToParent 选项来表达结构化任务 并行性 因为父任务隐式等待所有子任务 要完成的任务 所以我有这个代码 public async Task
  • 读取内核空间中的符号链接

    我正在编写 LKM 需要找出特定符号链接指向的位置 基本上我需要系统调用的功能readlinkat or readlink 但是在内核空间中 是否有捷径可寻 Using readlinkat直接对我不起作用 我总是收到 EFAULT 我猜这
  • 定义内部枚举[重复]

    这个问题在这里已经有答案了 在linux内核源代码中 我看到在枚举内部 是否还有一个与枚举元素同名的定义 示例中linux rtnetlink h我们有 enum RTM BASE 16 define RTM BASE RTM BASE R
  • 循环引用和 WCF

    我已经使用 POCO Generator 生成了 POCO 实体 我的数据库中有超过 150 个表 我在整个应用程序层 包括客户端 共享 POCO 实体 我在我的上下文中禁用了 LazyLoading 和 ProxyCreation 我在数
  • 在不知道xml文件结构的情况下解析xml文件内容

    我一直在学习一些使用 java 解析文件的新技术 对于 msot 部分 进展顺利 但是 我不知道如何将 xml 文件解析到收到后结构未知的位置 如果您知道结构的话 有很多关于如何执行此操作的示例 getElementByTagName 似乎
  • 如何获取android中加载mapview的进度状态?

    当地图处于加载状态时 我想在地图视图的中心放置一个进度条 如何获得进度 以及怎么办 给我一些例子 thanks 我认为没有任何合理的方法可以做到这一点 请注意 谷歌在其地图应用程序中也没有这样做 只需查看页面即可清楚地了解图块是否仍在加载
  • Spring security - oauth2 资源服务器测试

    我在使用 WebMvcTest 和 POST HTTP 方法测试 oauth2 资源服务器时遇到一些问题 当我不发送 csrf 令牌时 我总是收到 403 状态代码 即使当我使用不记名令牌时不需要该令牌 这是我要测试的 POST 方法 Po
  • 保持回发时的页面位置

    我有个问题
  • 从 URL 获取路径

    寻找一种从 PHP 中的 URL 获取路径的方法 我要拿 http example com hurrdurr 并做到 hurrdurr 我只想要后面的文字 com 我可以用修剪来做到这一点吗 Use parse url来提取你想要的信息 例
  • 为什么“fputc”使用 INT 作为参数而不是 CHAR?

    标准 C 库 int fputc int c FILE stream 并且这样的行为多次发生 例如 int putc int c FILE stream int putchar int c 为什么不直接使用 CHAR 呢 如果必须使用 IN
  • 通过 Gmail API 发送多部分/签名电子邮件 (RFC 3156)

    尝试构建符合 RFC3156 0 的消息 并通过 Gmail API 发送它 我正在使用 python 客户端实现 我得到的是 在我的 Gmail 邮箱中 邮件已正确发送 我看到的正是我之前构建的邮件 我的接收者得到的是 一条 多部分 混合
  • 通过 Promise 配置多种功能

    这是对使用量角器设置 firefox 配置文件 topic 根据setFirefoxProfilehowto 可以使用特殊的方式设置 firefox 配置文件 助手 js代码它使用firefox profile and q动态生成编码的 F
  • 如何使用 PHP Composer 从 Laravel 中删除包?

    使用 PHP Composer 从 Laravel 中删除包的正确方法是什么 到目前为止我已经尝试过 从文件中删除声明作曲家 json 在 要求 部分 删除任何类别名从文件app php 从我的代码中删除对该包的任何引用 Run compo
  • 如何在 C Makefile 中使用外部库和头文件?

    我在directory1中有一个头文件myheader h和一个静态库libmylib a文件 在directory2 中 我正在编写一个使用它们的程序 假设我在directory2中有main c 它使用myheader h和libmyl
  • JS 中“.innerHTML”和“.value”的区别

    我很困惑之间有什么区别 innerHTML and value在 JavaScript 中 这是我的代码 Input string
  • 如何将 postgres json 转换为整数

    我可以用to json 1 将 int 转换为 json 但如何将 json 转换为 int 这可能太慢了 to json 1 text int 另外 json 是从二进制块 bson 包装的还是简单的文本包装 对我有用的 使用 postg
  • $http 不在请求中发送 cookie

    We are working on a RESTful Webservice with AngularJS and Java Servlets When the user logs in our backend sends a Set Co
  • Java 11:补丁 sun.misc.BASE64Encoder

    这个问题不是重复的java lang NoClassDefFoundError sun misc BASE64Encoder 我正在尝试更新我的应用程序中的 Java 版本 至 11 并且我的应用程序中的库之一使用sun misc BASE
  • WPF 主题可以用于包含可在运行时更改的应用程序的多个外观吗?

    WPF 允许控件库为不同的系统主题提供不同的资源字典 本质上允许应用程序匹配操作系统选择的视觉主题 Aero Luna 等 我想知道是否可以在我的应用程序中包含多个主题资源字典 并利用框架内的一些现有主题支持 这应该适用于我自己的主题名称
  • 在 matplotlib 中围绕散点图中的数据点绘制平滑的多边形

    我有一堆带有两组数据的交叉图 并且一直在寻找一种 matplotlib 方法来用平滑的多边形轮廓突出显示它们的绘制区域 At the moment i just use Adobe Illustrator and amend saved p