Matplotlib:对数图中奇怪的双十年轴刻度

2024-02-13

我正在尝试在 Matplotlib 中制作一个涵盖数十年的双对数图。然而,返回给我的默认 x 轴刻度远非理想,因为它们一次覆盖二十个十年,其间只有 4 个刻度线。我正在使用的代码如下:

rc('text', usetex=True)
f,ax=plt.subplots(figsize=(10,8))
plt.xscale('log')
plt.yscale('log')
plt.ylim([1e26,1e29])
plt.xlim([20,1e10])
plt.xlabel(r'x',fontsize=22)
plt.ylabel(r'y',fontsize=22)
plt.tick_params(axis='both', which='major', labelsize=22,length=9,direction='in')
plt.tick_params(axis='both', which='minor', labelsize=22,length=5,direction='in')
ax.yaxis.set_tick_params(right='on',which='both')
ax.xaxis.set_tick_params(top='on',which='both')
plt.savefig('example.pdf',bbox_inches='tight')

返回给我的图像如下所示:

正如您所看到的,主要 x 轴标签从 10^3 到 10^5 等。另一方面,主要标签之间只有 4 个次要 x 轴标签。我希望每十年都有一个主要标签,就像在 y 轴上一样,每个十年之间有标准的 8 个刻度。此外,我希望 x 轴上的标签保持现在的样子,以免轴太混乱。也就是说,我希望 10^3、10^5、10^7、10^9 按现在的样子标记。我只想将主要/次要刻度扩展到其间的所有十年。

提前致谢。另外,如果有帮助的话,我正在使用 matplotlib 版本 2.0.0。我需要使用此版本(而不是旧版本)来获得仅在 2.0.0 中提供的附加功能。


似乎在 v2 中,matplotlib 进行了更改,以减少它在跨越大范围的对数轴上绘制的刻度/标签的数量。下面的代码显示了添加回刻度的一种方法。

有了这段代码,

import pylab as plt
import numpy as np
from matplotlib.ticker import LogLocator

plt.rc('text', usetex=True)
f,ax=plt.subplots(figsize=(10,8))
plt.xscale('log')
plt.yscale('log')
plt.ylim([1e26,1e29])
plt.xlim([20,1e10])
plt.xlabel(r'x',fontsize=22)
plt.ylabel(r'y',fontsize=22)
plt.tick_params(axis='both', which='major', labelsize=22,length=9,direction='in')
plt.tick_params(axis='both', which='minor', labelsize=22,length=5,direction='in')
ax.yaxis.set_tick_params(right='on',which='both')
ax.xaxis.set_tick_params(top='on',which='both')

# manipulate x-axis ticks and labels
ax.xaxis.set_major_locator(LogLocator(numticks=15)) #(1)
ax.xaxis.set_minor_locator(LogLocator(numticks=15,subs=np.arange(2,10))) #(2)
for label in ax.xaxis.get_ticklabels()[::2]:
    label.set_visible(False) #(3)

plt.savefig('example.pdf',bbox_inches='tight')

我每十年获得一次主要刻度,在主要刻度之间获得 8 个次要刻度,以及每隔一个主要刻度的轴标签。但由于我刚刚注册了一个帐户来发布此答案,因此我没有足够的声誉来分享相应的图像:(。

每个标记行的一些详细信息(请参阅上面代码中的编号注释):

  1. 增加允许的刻度线的最大数量。值 15 是 v1 的阈值,请参阅源代码matplotlib/lib/matplotlib/ticker.py.
  2. 当绘图轴跨越超过 5 个十年(未记录,但请参阅源代码)时,matplotlib v2 默认仅在 (2,4,6,8) 处绘制小刻度。这指定了小刻度的完整范围。
  3. 关闭所有其他 x 轴标签,请参阅例如这个答案 https://stackoverflow.com/a/20341184.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Matplotlib:对数图中奇怪的双十年轴刻度 的相关文章

随机推荐

  • 如何在“where value in...”子句中使用参数?

    当我只有一个状态代码作为参数时 这是有效的 当 parm list 中有多个 state code 时 如何使代码正常工作 要求 1 我不想在游标定义中对状态代码进行硬编码 2 我确实想在我的 where 子句中允许多个州代码 例如 我想运
  • Dot Net 核心应用程序的 Xunit 单元测试

    我最近开始学习单元测试 现在需要使用 Xunit 和 Moq 为 dot net core 应用程序编写单元测试 我可以编写一些非常基本的内容 但是当为复杂的类编写它们时 我有点陷入困境 下面是我将要为其编写测试的课程 public cla
  • 如何在使用maven构建的spring boot 2 java应用程序中使用groovy解释(带有spring-aop注释)?

    我有一个 spring boot 2 java 应用程序 想使用解释 未编译 的 groovy 代码来注入 aop 从阅读 spring 文档来看 这听起来像是可能的 但我找不到任何示例 AOP 建议脚本化 Bean https docs
  • 如何在没有 Spring Boot 的情况下阻止或防止 Spring MVC 4 应用程序的 XSS

    如何保护 清理采用原始 JSON 主体并通常输出 JSON 响应且不使用 Spring Boot 的应用程序 我只看到一个可能有效并使用 JsonComponent 的好例子 如果我们不使用 jsoncomponent 如何过滤掉请求以从整
  • 如何在 Fragment 上启动 Zxing?

    我有一个包含两个片段的活动 我想在其中一个片段上运行 ZXING 扫描仪 目前我在另一项类似的活动中这样做 gt new IntentIntegrator this initiateScan opens up Scan intent gt
  • 用于顺序内存访问的编译器嵌套循环优化。

    我在矩阵乘法基准测试中遇到了一个奇怪的性能问题 Metis 中的 matrix mult MOSBENCH http pdos csail mit edu mosbench 套房 基准测试经过优化 可平铺数据 使活动工作集大小为 12kb
  • 将 MongoDB 集合的子集保存到另一个集合

    我有一套像这样 date 20120101 date 20120103 date 20120104 date 20120005 date 20120105 如何将日期为 20120105 的文档子集保存到另一个集合 i e db subse
  • Arduino I2S 正弦波

    我正在开发一个项目 我想通过组合不同的正弦波来生成 简单 声音 我使用的是 arduino mkrZero 因为它内置了 I2S 接口 并且似乎有足够的处理能力来满足我的需求 I have wired my system exactly l
  • 从 Safari 中 Web 应用程序中的链接打开 iPhone 应用程序

    我正在尝试从 Safari 中的链接打开我的本机 iPhone 应用程序 我已关注这个链接 http iosdevelopertips com cocoa launching your own application via a custo
  • 如何实现React Router SPA的滚动恢复

    我正在构建一个 React 单页应用程序 我注意到滚动恢复在 Chrome 也许还有其他浏览器 中似乎没有按预期工作 在react router dom github repo上 他们有一个页面说浏览器是开始本地处理滚动 https git
  • Linq to SQL 与 Entity Framework,Microsoft 支持

    两者的优点 缺点是什么 另外 我听到了有关 Microsoft 是否会继续支持 LINQ to SQL 的各种传言 如果能提供有关此方面的进一步信息 我们将不胜感激 据我所知 根据我对上一次 PDC 的记忆 L2S 将继续得到支持 所有重点
  • EntityFramework 类上的AllowHtml 属性

    是否有不同的方法在 EntityFramework 自动生成的类的属性上设置 AllowHtml 属性 我讨厌更改自动生成的文件 因为每次更改模型时 我的更改都会丢失 但是除了使用属性之外 没有其他明显的方法可以为特定属性设置 AllowH
  • Codeigniter 的 insert_batch() 具有数千个插入,但缺少记录

    我在用着insert batch 将 10000 多行批量插入数据库的表中 我正在进行一些测试 我注意到有时所有 10 000 多行都被正确插入 但在某些情况下我在表的总计数中遗漏了 100 多行 我所拥有的记录中的字段数据没问题 因为我在
  • DataGrid RowStyle - DataTrigger 中的绑定值

    我想建立一个RowStyle这改变了Visibility行的数量 取决于两个条件 OR 默认情况下 无论布尔值 在 ViewModel 中 是否设置为 所有行都应折叠并可见True或中的一个值DataTable 绑定到Datagrid 等于
  • XHR 上传 onprogress 事件不适用于 HTTPS 连接

    我有一个通过 Angular 7 和 Node Js 将文件上传到 AWS S3 的设置 上传工作正常 但有一个问题xhr upload onprogress event 仅当通过托管服务器时才会触发此事件http 当使用https连接时
  • C# 中使用的 AForge.Video.FFMPEG

    我使用 Visual C 2008 想要从 bmp 序列写入 AVI 文件 我找到了 AForge Video VWF 但它仅适用于 vmw3 或 DIB 编解码器 我想使用 AForge Video FFMPEG 但出现错误 例如我只是编
  • ngModel 与 formControlName 位于同一表单字段上

    我曾经有一个没有任何验证的简单表单 其中 HTML 大致如下所示
  • 将字体-Awesome 图标旋转 180 度在下拉按钮内

    我创建了一些自定义按钮样式 并使用引导下拉菜单类将它们转换为下拉菜单 当我单击按钮时 我希望在下拉菜单打开时内部的 font awesome 图标旋转 180 度 并在按钮失去活动 焦点后以相反的方式旋转 180 度 返回到其原始位置 我能
  • 定义全局数组常量以在视图中使用

    我想定义全局数组常量 bootstrap php 中的代码 adv types array top gt left gt right gt bottom gt 视图文件中的代码 echo form gt input Adv type arr
  • Matplotlib:对数图中奇怪的双十年轴刻度

    我正在尝试在 Matplotlib 中制作一个涵盖数十年的双对数图 然而 返回给我的默认 x 轴刻度远非理想 因为它们一次覆盖二十个十年 其间只有 4 个刻度线 我正在使用的代码如下 rc text usetex True f ax plt