Matplotlib loglog 的错误刻度/标签(双轴)

2024-05-16

我正在使用 matplotlib 创建对数图。如下图所示,默认刻度选择得很糟糕(充其量是这样);右边的 y 轴甚至根本没有(在线性等效中确实如此),而两个 x 轴都只有一个。

有没有办法获得合理数量的带有标签的刻度,without为每个情节手动指定它们?


编辑:确切的代码太长,但这是问题的一个简短示例:

x = linspace(4, 18, 20)
y = 1 / (x ** 4)
fig = figure()
ax = fig.add_axes([.1, .1, .8, .8])
ax.loglog(x, y)
ax.set_xlim([4, 18])
ax2 = ax.twiny()
ax2.set_xlim([4 / 3., 18 / 3.])
ax2.set_xscale('log')
show()

我一直在与你所展示的类似的东西进行斗争(轴范围内只有一个主要刻度)。 matplotlib 刻度格式化程序都不让我满意,所以我使用matplotlib.ticker.FuncFormatter来实现我想要的。我还没有使用双轴进行测试,但我的感觉是它应该可以工作。

import matplotlib.pyplot as plt
from matplotlib import ticker
import numpy as np

#@Mark: thanks for the suggestion :D
mi, ma, conv = 4, 8, 1./3.
x = np.linspace(mi, ma, 20)
y = 1 / (x ** 4)

fig, ax = plt.subplots()

ax.plot(x, y)  # plot the lines
ax.set_xscale('log') #convert to log
ax.set_yscale('log')

ax.set_xlim([0.2, 1.8])  #large enough, but should show only 1 tick

def ticks_format(value, index):
    """
    This function decompose value in base*10^{exp} and return a latex string.
    If 0<=value<99: return the value as it is.
    if 0.1<value<0: returns as it is rounded to the first decimal
    otherwise returns $base*10^{exp}$
    I've designed the function to be use with values for which the decomposition
    returns integers
    """
    exp = np.floor(np.log10(value))
    base = value/10**exp
    if exp == 0 or exp == 1:
        return '${0:d}$'.format(int(value))
    if exp == -1:
        return '${0:.1f}$'.format(value)
    else:
        return '${0:d}\\times10^{{{1:d}}}$'.format(int(base), int(exp))

# here specify which minor ticks per decate you want
# likely all of them give you a too crowed axis
subs = [1., 3., 6.]
# set the minor locators
ax.xaxis.set_minor_locator(ticker.LogLocator(subs=subs))
ax.yaxis.set_minor_locator(ticker.LogLocator(subs=subs))
# remove the tick labels for the major ticks: 
# if not done they will be printed with the custom ones (you don't want it)
# plus you want to remove them to avoid font missmatch: the above function 
# returns latex string, and I don't know how matplotlib does exponents in labels
ax.xaxis.set_major_formatter(ticker.NullFormatter())
ax.yaxis.set_major_formatter(ticker.NullFormatter())
# set the desired minor tick labels using the above function
ax.xaxis.set_minor_formatter(ticker.FuncFormatter(ticks_format))
ax.yaxis.set_minor_formatter(ticker.FuncFormatter(ticks_format))

The figure that I get is the following enter image description here:

当然,您可以为 x 轴和 y 轴设置不同的次要定位器,并且可以将所有内容包装起来ticks_format到最后进入接受轴实例的函数ax and subs or subsx and subsy作为输入参数。

我希望这对你有帮助

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

Matplotlib loglog 的错误刻度/标签(双轴) 的相关文章

  • 将相同的 Patch 实例添加到 matplotlib 中的多个子图中

    我正在尝试将补丁的相同实例添加到 matplotlib 中的多个轴 这是最小的例子 import matplotlib pyplot as mpl plt import matplotlib patches as mpl patches f
  • matplotlib 中的固定大小矩形?

    Is there any way to plot a rectangle spanning the entire length of the X axis but with a fixed and static height of say
  • 如何使用 matplotlib 面向对象的 API 设置轴刻度和刻度标签

    我需要一些在 Python2 7 下的 Matplotlib pyplot 中绘图的帮助 我想生成一个具有以下 x 轴的图 x 轴应该是这样 https i stack imgur com zcosX jpg 我到目前为止通过使用myaxi
  • 如果值小于零,则更改条形图的颜色并填充空白

    我创建了一个数据框 df tail 20 Speed 130 0 000272 131 0 000219 132 0 000178 133 0 000234 134 0 000261 135 0 000281 136 0 000244 13
  • 使用ggplot2绘制多条曲线

    假设我有一个数据框coefs其中每行包含曲线的模型系数 coefs lt structure list a1 c 1 22228259789383 1 2064168157394 1 09555089661994 0 94394743347
  • python 中带有滑块的散点图

    嘿 我正在尝试使用滑块创建一个散点图 当我滑动时该滑块会更新该图 这是我到目前为止的代码 它绘制了一个散点图和一个滑块 但当我移动它时 什么也没有发生 我怀疑问题出在 set ydata有点 但我似乎无法在互联网上找到其他方法 import
  • R:as.double(y)中的错误:无法将类型“S4”强制为“double”类型的向量 - 光栅数据

    我在 Studio 中使用光栅工作 tif图像 我看过有关使用下面的代码绘制栅格的教程 但它对我不起作用 我收到错误 as double y 中的错误 无法将类型 S4 强制为 double 类型的向量 我已经加载了必要的包 raster
  • 在 R markdown 中,如何防止非缓存块的绘图被单独保存?

    当编织 R markdown 文件时 从任何块输出的图cache TRUE独立于 HTML 输出保存 这对我来说很有意义 然而 如果即使是单个块也有cache TRUE选项集 all块 包括那些cache FALSE 将他们的地块独立保存
  • Python 3.x 中的绘图

    在Python 2 6中 我使用matplotlib制作了一些简单的图表 但是 它与 Python 3 1 不兼容 有哪些替代模块可以完成相同的事情而不非常复杂 您说您想创建一些简单的图表 但没有真正说明您想要多简单或哪种类型的图表 只要它
  • 基本 R 图:帮助减少多个图之间的空间

    我试图减少一个窗口中多个绘图之间的空间量 但无法实现我想要的 情节和代码如下 我想将图例保留在原处 但减少 B 和 C 之间的空间 如何将图 C 向左 移动到靠近图 B 的位置以模仿 A 和 B 之间的间距 同时保持图例就位 我希望传奇是独
  • 拟合泊松直方图

    I am trying to fit a curve over the histogram of a Poisson distribution that looks like this 我修改了拟合函数 使其类似于泊松分布 其中参数 t 作
  • 连接极线ggplot图中的间隙

    当 ggplot 使用极坐标绘制线图时 它会在最高和最低 x 值之间留下间隙 Dec and Jan如下 而不是缠绕成螺旋状 我怎样才能继续这条线并缩小差距 特别是 我想使用月份作为 x 轴 但在一条循环线上绘制多年的数据 Reprex l
  • 导入 matplotlib.pyplot 挂起

    我正在尝试在 OS X 10 8 4 上启动并运行 matplotlib 我已经安装了 matplotlib 和依赖项 libping freetype numpy scipy 我可以很好地导入 matplotlib 但是 如果我尝试导入
  • 自定义seaborn jointplot中的轴标签

    我似乎陷入了一个相对简单的问题 但在经过一小时的搜索和大量的实验后无法解决它 我有两个 numpy 数组x and y我正在使用seaborn的联合图来绘制它们 sns jointplot x y 现在我想分别将 x 轴和 y 轴标记为 X
  • 如何在Python中绘制“Trace Explorer”?

    我需要重新创建一个情节 踪迹浏览器 https www bupar net trace explorer html与下面在 R 中创建的类似 我希望使用 matplotlib 但找不到任何有关如何执行这样的跟踪资源管理器的示例或参考 有人能
  • 如何缩放图像的一部分并插入到 matplotlib 中的同一图中

    我想缩放数据 图像的一部分并将其绘制在同一个图中 看起来有点像这个图 是否可以在同一图中插入缩放图像的一部分 我认为可以用子图绘制另一个图形 但它绘制了两个不同的图形 我还阅读了添加补丁以插入矩形 圆形 但不确定将图像的一部分插入到图中是否
  • pyplot,为什么x轴不显示?

    我正在尝试根据日期绘制一些值 但是 不幸的是我没有在 x 轴上获得任何值 我觉得这可能有两个因素造成 这些值存储为 日期 因此使过程变得复杂 由于日期将在 x 轴上占据太多空间 因此它变得太混乱 因此这就是为什么我只看到一条黑线 请让我知道
  • 基于 Unix ASCII 的命令行图表/绘图工具

    有没有好的命令行 UNIX 图表 绘图 绘图工具 我正在寻找能够在 ASCII 图表上绘制 xy 点的东西 澄清一下 我正在寻找能够以 ASCII 格式输出图形 如 ascii art 风格 的东西 这样我就可以在交互式 shell 会话中
  • 如何绘制沿染色体图形的位置

    我想生成一个图 描绘我所研究的生物体的 14 条线性染色体 按比例绘制 并在每条染色体的指定位置上用彩色条表示 理想情况下 我想使用 R 因为这是我有经验的唯一编程语言 我探索了多种方法来做到这一点 例如使用 GenomeGraphs 但我
  • 绘制到图像对象

    我可以保存一个图imshow 因为它返回一个图像对象 如下所示 image plt imshow list interpolation None 后来我想创建其中许多图像的动画 将其保存在列表中并将其渲染为视频 如果这种方法很愚蠢 请告诉我

随机推荐