如何在对数图中设置双轴刻度

2023-12-09

在我的图中,辅助 x 轴用于显示某些数据的另一个变量的值。现在,原始轴已按对数缩放。不幸的是,孪生轴将刻度(和标签)放置在原始轴的线性刻度上,而不是按照对数刻度。如何克服这个问题?

这里的代码示例应该将孪生轴的刻度放在与原始轴相同的(绝对轴)位置:

    def conv(x):
        """some conversion function"""
        # ...
        return x2

    ax = plt.subplot(1,1,1)
    ax.set_xscale('log')

    # get the location of the ticks of ax
    axlocs,axlabels = plt.xticks()

    # twin axis and set limits as in ax
    ax2 = ax.twiny()
    ax2.set_xlim(ax.get_xlim())

    #Set the ticks, should be set referring to the log scale of ax, but are set referring to the linear scale
    ax2.set_xticks(axlocs)

    # put the converted labels
    ax2.set_xticklabels(map(conv,axlocs))

另一种方法是(刻度线不会设置在同一位置,但这并不重要):

    from matplotlib.ticker import FuncFormatter

    ax = plt.subplot(1,1,1)
    ax.set_xscale('log')

    ax2 = ax.twiny()
    ax2.set_xlim(ax.get_xlim())
    ax2.xaxis.set_major_formatter(FuncFormatter(lambda x,pos:conv(x)))  

只要不使用对数刻度,这两种方法都可以正常工作。

也许有一个简单的解决办法。文档中是否有我遗漏的内容?

作为解决方法,我尝试获取 ax 的刻度的 ax.transAxes 坐标,并将刻度放在 ax2 中的同一位置。但不存在类似的东西

    ax2.set_xticks(axlocs,transform=ax2.transAxes)
    TypeError: set_xticks() got an unexpected keyword argument 'transform'

不久前就有人问过这个问题,但我偶然发现了同样的问题。

我最终通过引入对数尺度(semilogx) 透明的 (alpha=0)虚拟情节。

Example:

import numpy as np
import matplotlib.pyplot as plt

def conversion_func(x):  # some arbitrary transformation function
    return 2 * x**0.5        # from x to z

x = np.logspace(0, 5, 100)
y = np.sin(np.log(x))

fig = plt.figure()

ax = plt.gca()
ax.semilogx(x, y, 'k')
ax.set_xlim(x[0], x[-1])  # this is important in order that limits of both axes match
ax.set_ylabel("$y$")
ax.set_xlabel("$x$", color='C0')
ax.tick_params(axis='x', which='both', colors='C0')
ax.axvline(100, c='C0', lw=3)

ticks_x = np.logspace(0, 5, 5 + 1)  # must span limits of first axis with clever spacing
ticks_z = conversion_func(ticks_x)
ax2 = ax.twiny()  # get the twin axis
ax2.semilogx(ticks_z, np.ones_like(ticks_z), alpha=0)  # transparent dummy plot
ax2.set_xlim(ticks_z[0], ticks_z[-1])
ax2.set_xlabel("$z \equiv f(x)$", color='C1')
ax2.xaxis.label.set_color('C1')
ax2.tick_params(axis='x', which='both', colors='C1')
ax2.axvline(20, ls='--', c='C1', lw=3)  # z=20 indeed matches x=100 as desired

fig.show()

matplotlib plot with second (twin) axis with different, logarithmic scale.

在上面的示例中,垂直线表明第一轴和第二轴确实根据需要相互移动。x = 100被转移到z = 2*x**0.5 = 20。颜色只是为了阐明哪条垂直线与哪条轴对应。

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

如何在对数图中设置双轴刻度 的相关文章

随机推荐

  • 如何在Java中读取application.yml文件

    我写了一个电子邮件程序 但我必须更改一些配置 所以在我的项目中我需要知道如何从 yaml 中读取我的 loginUrl 我的代码如下 userNotificationEmail setIsActive F userNotificationE
  • 如何将东部时区转换为中部时区

    我的时间位于东部时区 但我想将其调整为中部时区 两个时区均位于美国 我以前从来没有这样做过 我不知道如何转换它 请帮我 这是一种可能的方法 dt new DateTime 2011 02 22 16 15 20 new DateTimeZo
  • R:从循环中打印单独的迭代?

    我正在使用 R 编程语言 通常 我从循环中打印迭代 这有助于我跟踪事情 例如 my list list for i in 1 1000 tryCatch frame i rnorm 1 1 1 my list i frame i ifels
  • 为什么有些 Docker 镜像没有定义 VOLUME?

    我刚刚开始接触 Docker 如果我的问题对你来说太傻了 请原谅我 我看到一些图像 例如nginx 没有任何VOLUME定义而有些图像像mysql has VOLUME在他们的 Dockerfile 中定义 当没有定义卷时如何管理数据或文件
  • 在symfony2中引用静态模板

    我想将 Angular 与 symfony2 一起使用 为此 应该可以从像这样的引用加载模板 div div 载荷是角度的部分 我们只需提供模板的路径即可 模板不应该用树枝渲染 这可以用 symfony 实现吗 简单地制作一个没有树枝标签的
  • PDF 中的统一码

    我的程序根据要求生成相对简单的 PDF 文档 但我在处理 unicode 字符 如汉字或奇怪的数学符号 时遇到问题 要在 PDF 中写入普通字符串 请将其放在括号中 something 还可以选择使用八进制代码转义字符 527 但这最多只能
  • 使用PHP代码从多维数组获取数据

    我正在尝试获取这些数据 label gt For Rent来自多维数组 这是我的数组 Array listing id gt 0 fields gt Array 1 gt Property House 7 2 gt 30 4 gt sdfa
  • 停止预定的 JavaScript 执行

    我有一个函数 在其中定义了很多 setTimeout 函数 当用户按下按钮时 它就开始执行 我怎样才能取消它 有什么方法可以取消所有超时 假设我有多个没有名字的超时 start timer var timer setTimeout canc
  • Expressjs+socket.io+express-session

    我的 server js 中有这段代码 var app require express session require express session cookie require cookie cookieParser require c
  • 本体中实体的排序

    我有一个系统 可以在本体 通常的三重存储 中对一些领域数据进行建模 我一直在寻找一种表达复数和排序的方法 但没有通过谷歌找到任何东西 我的主要用例是 域中的一个实体可以是一系列任务 买杂货 做饭 吃饭等 但总的来说 我觉得有能力 衡量 你的
  • 此 python 代码是否使用深度优先搜索 (DFS) 来查找所有路径?

    这段代码给出在python图论官方论文 这是代码 def find all paths graph start end path path path start if start end return path if not graph h
  • rake db:migrate (mysql) [重复]

    这个问题在这里已经有答案了 可能的重复 库未加载 尝试使用 mysql2 gem 在 OS X 10 6 上运行 rails server 时出现 libmysqlclient 16 dylib 错误 为什么我收到这个错误 什么意思 我已经
  • 如何获得数组中高于某个数字的最小值?

    我有一个像这样的数组 5229561 gt 8 5229582 gt 9 5229583 gt 10 5229584 gt 11 如果数组已排序并且键是连续的 例如 100 101 102 没有 78 5 13 则可以使用二分搜索 总的来说
  • 如何以另一种形式调用PHP中的函数?

    我有一个带有名字的页面1 php里面有一个功能 现在我想调用该函数2 php在 PHP 2 中 我写了func 这个函数在1 php 但它有这个错误 Fatal error Call to undefined function func i
  • 如何以编程方式在 Selenium Jupiter 的基类中配置 WebDriver?

    我想将基于 JUnit 4 的现有 Selenium 测试迁移到 JUnit 5 为此 我想利用硒 木星 测试必须满足的一项要求是 能够在运行时切换 WebDriver 实现 基于执行环境 使用所有测试的一个公共基类 在开发人员计算机 Wi
  • Eclipselink 支持包含正则表达式的查询吗?

    我已经看到像 MySQL 这样的 DBMS 支持包含正则表达式的查询 Eclipselink 支持这个吗 我必须检索具有与某些正则表达式匹配的某些字符串属性的实体 SELECT X FROM Person X WHERE X name
  • Phoenix.ActionClauseError at POST,没有匹配的操作子句来处理请求

    每当我发布到 api subastas 时 我都会收到此错误 Phoenix ActionClauseError at POST api subastas bad request to IascSubastas SubastaControl
  • 将 Python 列表和字典理解与计数器结合起来

    我想传输元组列表 1 3 5 2 4 6 7 8 9 到一个列表dict 为了创建一个 pandas 数据框 如下所示 index 1 match 1 index 1 match 3 index 1 match 5 index 2 matc
  • Android上从网页启动流媒体音频播放器的方法

    要链接到 SHOUTcast HTTP 互联网广播流 传统上您会链接到播放列表文件 例如 M3U 或 PLS 从那里 浏览器将启动注册来处理播放列表的音频播放器 这适用于任何 PC Palm Blackberry 和 iPhone 这个方法
  • 如何在对数图中设置双轴刻度

    在我的图中 辅助 x 轴用于显示某些数据的另一个变量的值 现在 原始轴已按对数缩放 不幸的是 孪生轴将刻度 和标签 放置在原始轴的线性刻度上 而不是按照对数刻度 如何克服这个问题 这里的代码示例应该将孪生轴的刻度放在与原始轴相同的 绝对轴