使用 set_xlim() 切片图后 matplotlib autoscale(axis='y')

2023-12-05

作为演示,我绘制了 x^0 到 x^9,其中 x 值的范围为 10 到 20。

然后我对这些图像进行切片,得到 9 个切片:

x = (10 到 11), (11 到 12) 等等到 (18 到 19)

我希望裁剪图像,以便 y 值始终在每个切片中从上到下分布,但我得到的是自动缩放始终缩放到完整数据集而不是当前切片。

import matplotlib.pyplot as plt
import numpy as np


# create some test data
for i in range(10):
    x = np.arange(10,20)
    y = x**i
    plt.plot(x,y,c='red',marker='.',ms=2)

# get all x values in chart and reduce to a sorted list set
xd = [] 
for n in range(len(plt.gca().get_lines())):
        line = plt.gca().get_lines()[n]
        xd.append((line.get_xdata()).tolist())
xd = [item for sublist in xd for item in sublist]
xd = sorted(list(set(xd)))

# attempt to plot slices of x with autoscaled y
ax = plt.gca()
for i in range(len(xd)-1):
    ax.set_xlim([xd[i],xd[i+1]])
    ax.axes.autoscale(enable=True,axis='y', tight=True)
    plt.pause(1) #timing
    #uncommenting the next line will create nine tiny (6kb) image files
    #plt.savefig(('image_%s.png' % i), bbox_inches=0, dpi=48)

在我的实际应用程序中,我尝试以这种方式从随机数据生成 100k 个微小图像作为数据库。对于每个 x,都有 2 到 200 个 y 值。然后,我使用 OpenCV 对新图像进行图像匹配,以使其与历史数据库最匹配。

至关重要的是,OpenCV 在每个图像中从上到下拉伸 y 值以找到良好的匹配。

如果它有帮助,我的 x 值将始终是 int() 类型且等距

ETA:我尝试​​在这里实施一些解决方案,但没有取得任何进展:

Matplotlib - 修复 x 轴刻度和自动缩放 y 轴

Matplotlib基于手动缩放的x轴缩放y轴

但至少我学到了:

自动缩放始终使用整个数据范围,因此 y 轴是 按 y 数据的全部范围进行缩放,而不仅仅是按 y 数据范围内的内容进行缩放 x 限制。

但仍然没有在这里有效的解决方案

def autoscale_y()

由@DanHickstein 提出

给我:

h = np.max(y_displayed) - np.min(y_displayed)
ValueError: zero-size array to reduction operation maximum which has no identity

从这些链接中,我不确定在我的 for 循环中在哪里实现 @Joe Kington 的掩码解决方案。

我现在正在使用此处提出的 @bernie 解决方案来获取给定 X 的 Y 值:

如何从图中提取点?

也许我可以 set_ylim() 手动给出该 X 处的最小和最大 Y 值?

如果有一种方法可以在定义的 xlim 中自动缩放作为标准 matplotlib 方法,那么这会容易得多


我昨晚通过创建一个以 x 作为键、以 y 的相应列表作为值的字典来解决我的问题。

当数据由函数 y=x**i 创建时会发生这种情况

本质上我正在创建字典结构伪代码:

data[x0] = [x0y1,x0y2,x0y3....]
data[x1] = [x1y1,x1y2,x1y3....]
data[x2] = [x2y1,x2y2,x2y3....]
etc.

我稍后可以引用任何给定 x 处的所有 y 值。从那里,找到切片左侧和右侧的最小和最大 y 值,以手动设置 ylim。如果您的 xlim 切片宽度超过一个 x 段,您必须对 xlim 中的每个相应 x 切片重复该过程。在我的例子中,我的 x 切片正好是一段宽。

import matplotlib.pyplot as plt
import numpy as np

# move my range function out of my data creation loop
x = np.arange(10,20,1)

# create a dictionary of my data with x values as keys
data = {}
for i in range(len(x)):
   data[x[i]]=[]

# create some test data
for i in range(10):
    y = x**i
    plt.plot(x,y,c='red',marker='.',ms=2)

    # store my y data to my data dictionary as its created
    xx = x[-len(y):]
    for j in range(len(xx)):
        data[xx[j]].append(y[j])

# get all x values in chart and reduce to a sorted list set
xd = [] 
for n in range(len(plt.gca().get_lines())):
        line = plt.gca().get_lines()[n]
        xd.append((line.get_xdata()).tolist())
xd = [item for sublist in xd for item in sublist]
xd = sorted(list(set(xd)))

# attempt to plot slices of x with autoscaled y
ax = plt.gca()
for i in range(len(xd)-1):
    ax.set_xlim([xd[i],xd[i+1]])

    # reference my min and max y values by left and right borders of x slice
    ymin = min(min(data[xd[i]]), min(data[xd[i+1]]))
    ymax = max(max(data[xd[i]]), max(data[xd[i+1]]))
    # manually set y limits
    ax.set_ylim([ymin,ymax])

    #eliminate my autoscale call
    #ax.axes.autoscale(enable=True,axis='y', tight=True)
    plt.pause(1) #timing

现在,当它绘图时,y 会自动缩放到 x 切片,而不是整个数据集。

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

使用 set_xlim() 切片图后 matplotlib autoscale(axis='y') 的相关文章

随机推荐

  • 如何在 Android 中动态切换 XML 样式?

    长话短说 我有一个应用程序 我在其中直接将样式属性应用于活动和片段的 XML 文件 现在我将其重构为styles xml文件 我几乎不敢直接修改主题本身 因为我之前已经尝试过类似的东西 继承变得混乱 所以 我的作品里有好几种这样的风格sty
  • R 子集的回归

    我想对不同国家 即我的数据的子集 运行相同的回归 我确实弄清楚了如何在 R 中执行此操作 但是在 Stata 中更轻松地完成相同的操作之后 我想知道 R 中是否有更好的方法 在 Stata 中你会做这样的事情 foreach country
  • PDF 中的透明图像

    This PDF由多个源代码片段组成 其中五个是包含 Alpha 通道的 PNG 一种是没有 Alpha 通道的 PNG 最后一张是带有透明效果的 Photoshop PDF 这些部件是使用 ABCpdf 9 1 组装的 在 Acrobat
  • 在 CLX TEdit 的 KeyPress 事件中拦截 TAB 键

    我有一个 TEdit VisualCLX 组件 我想覆盖 onKeyPress 事件中 TAB 键的行为 但是如果我尝试拦截 KeyPress 事件中的 TAB 键 它将不起作用 因为当在 TEdit 上按下 Tab 键 如何拦截 TEdi
  • 无法在 centos VPS 上通过 google smtp 发送电子邮件

    我正在尝试通过 google SMTP 发送电子邮件 该代码在我本地 Windows PC 的 tomcat 中运行良好 但我在我的 centos VPS 上遇到了这个错误 org apache commons mail EmailExce
  • 当我删除指针时出现分段错误(核心转储)

    我正在尝试从链接列表中删除重复项 并遇到了一个问题 这可能是显而易见且简单的 但我没有使用过C 多年来 我无法通过阅读类似的问题来找出我做错了什么 下面是我的代码的一部分 我删除了不相关的部分 例如构造函数 其他方法等 template
  • asp.net webapi 2 post参数始终为空

    过去一个小时我一直在试图弄清楚这是我们的 但我不明白它出了什么问题 这篇文章来自我正在编写的 Xamarin 应用程序 使用 RestSharp 便携式客户端 POST http 192 168 30 103 8080 api Order
  • 类型错误:不可散列的类型:'dict',当 dict 用作​​另一个 dict 的键时 [重复]

    这个问题在这里已经有答案了 我有这段代码 for element in json referenceElement keys 当我运行该代码时 我收到此错误 类型错误 不可散列的类型 dict 该错误的原因是什么 我可以采取什么措施来修复它
  • CountIf - 如何转义特殊字符(尖括号)

    我正在尝试使用 VBA 计算 Excel 电子表格中特定单元格值出现的次数 单元格值是一个 XML 标记 函数将尖括号解释为小于 大于 如何逃脱这些字符 微软说 您可以使用通配符 问号 和星号 作为条件 问号匹配任何单个字符 星号匹配任何字
  • ui-router 默认子状态不起作用

    我正在测试UI Router嵌套状态 但我无法在父 子场景中设置默认状态 请帮助 图书馆 角度 1 3 15 用户界面路由器 0 2 15 导航路径 home settings parent state page settings defa
  • 如何在约束布局上实现重叠/负边距?

    是否可以在约束布局上实现负边距以实现重叠 我试图让图像以布局为中心 并有一个文本视图 使其与 x dp 重叠 我尝试设置负保证金值 但没有成功 如果有办法实现这一点那就太好了 Update 约束布局现在版本 2 1 0 alpha2 支持负
  • 从一个函数返回不同维度的数组;在 F# 中可以吗?

    我正在尝试将一些 Python 转换为 F 特别是numpy random randn 该函数采用可变数量的 int 参数 并根据参数的数量返回不同维度的数组 我相信这是不可能的 因为不能有一个返回不同类型的函数 int int int 等
  • 使用代码更新故事板约束

    我有一个UIImage在代码中 我想在按下按钮时垂直放大 这UIImage完全限制在故事板中 我想在按下按钮时更改其高度 我已经链接了UIImage及其在代码中的高度约束 IBOutlet weak var botBotCons NSLay
  • 当我不将 .Save() 的位图 .Dispose() 保存到 MemoryStream 时,为什么会出现内存泄漏?

    假设我创建了一个位图 Bitmap bitmap new Bitmap 320 200 当我将其写入某个流时 在我的例子中 它是一个 HttpResponseStream 由 HttpListenerResponse 给出 一切都很好 bi
  • Java机器人类mouseMove不去指定的位置

    老实说 我不完全确定出了什么问题 这是 if 和 if else 下的大量其他基本机器人命令动作的简短版本 每当我运行该程序时 鼠标应移动到指定位置并单击 但是 当我运行程序时 它不会移动到我指示的位置 而是每次运行时它都会移动到不同的位置
  • 将大型 Git 存储库拆分为许多较小的存储库

    成功将 SVN 存储库转换为 Git 后 我 现在拥有一个非常大的 Git 存储库 我想将其分解为多个较小的存储库并维护历史记录 那么 有人可以帮助分解可能如下所示的存储库 MyHugeRepo git DIR A DIR B DIR 1
  • 如何在wpf中实现主题化

    我想在 WPF 中实现 ASP Net 类型主题 用户可以选择各种预定义主题 并且可以切换到另一个主题 为了实现这一点 我尝试为每个主题创建不同的资源字典 并使用键存储所需的样式 所有主题中的键集合都是相同的 但每个主题的定义都不同 我使用
  • 将矩阵中每个等于 0 的元素替换为上一行的相应元素

    我正在使用 R 我有一个矩阵 我想用上面行的相应元素替换它等于零的每个元素 例如 我创建了以下矩阵 AA lt matrix c 1 2 3 1 4 5 1 0 2 ncol 3 nrow 3 1 2 3 1 1 1 1 2 2 4 0 3
  • 如何在两个 Android 应用之间共享应用内购买

    我有两个 Android 应用程序 app1 和 app2 它们都是免费的 但 app2 包含应用程序内购买升级 现在我要将这两个应用程序合并到 app1 没有应用内购买的应用程序 中 我的问题是 如何保留已在 app2 中消费的购买 以便
  • 使用 set_xlim() 切片图后 matplotlib autoscale(axis='y')

    作为演示 我绘制了 x 0 到 x 9 其中 x 值的范围为 10 到 20 然后我对这些图像进行切片 得到 9 个切片 x 10 到 11 11 到 12 等等到 18 到 19 我希望裁剪图像 以便 y 值始终在每个切片中从上到下分布