gpt4 book ai didi

python - 多个 y 轴转换刻度

转载 作者:行者123 更新时间:2023-12-04 23:49:50 25 4
gpt4 key购买 nike

Conversion scale with 'parasitic' parallel y axis

Conversion scale with shared y axis

你好

我正在尝试创建包含 y 轴上两组单位的并行转换比例的图;使用两种不同的风格:

  • 偏移('寄生')y 轴和
  • 重叠/共享 y 轴

  • 在附加的示例图像中复制左侧 y 轴的样式。

    我想找到生成上述两个示例图的最简单的通用方法,这还允许我通过将两组单位之间的关系定义为函数来生成 y 轴转换比例(在本例中:mmHg = kPa * 7.5)。

    如果可以添加这些示例中显示的第三个右侧 y 轴( Steam 浓度和水含量),它们与左侧刻度无关,这将是一个奖励。

    我已经阅读了有关使用 twinx 和 twiny 函数使用多个 x 和 y 轴的相关 stackoverflow.com 帖子和示例 - 例如
    here - 以及 Matplotlib 食谱,但我找不到解决此特定问题的示例。

    我将非常感谢任何最小的工作示例或链接。

    我在 Spyder 2.2.1/Python 2.7.5 中使用 Matplotlib

    非常感谢期待

    戴夫

    最佳答案

    对于第一个情节,我推荐 axisartist .两个y的自动缩放左侧的 -axis 是通过适用于指定 y 的简单缩放因子实现的。 - 限制。第一个示例基于 parasite axes 上的解释:

    import numpy as np
    from mpl_toolkits.axes_grid1 import host_subplot
    import mpl_toolkits.axisartist as AA
    import matplotlib.pyplot as plt

    # initialize the three axis:
    host = host_subplot(111, axes_class=AA.Axes)
    plt.subplots_adjust(left=0.25)

    par1 = host.twinx()
    par2 = host.twinx()

    # secify the offset for the left-most axis:
    offset = -60
    new_fixed_axis = par2.get_grid_helper().new_fixed_axis
    par2.axis["right"] = new_fixed_axis(loc="left", axes=par2, offset=(offset, 0))
    par2.axis["right"].toggle(all=True)

    # data ratio for the two left y-axis:
    y3_to_y1 = 1/7.5

    # y-axis limits:
    YLIM = [0.0, 150.0,
    0.0, 150.0]

    # set up dummy data
    x = np.linspace(0,70.0,70.0)
    y1 = np.asarray([xi**2.0*0.032653 for xi in x])
    y2 = np.asarray([xi**2.0*0.02857 for xi in x])

    # plot data on y1 and y2, respectively:
    host.plot(x,y1,'b')
    par1.plot(x,y2,'r')

    # specify the axis limits:
    host.set_xlim(0.0,70.0)
    host.set_ylim(YLIM[0],YLIM[1])
    par1.set_ylim(YLIM[2],YLIM[3])

    # when specifying the limits for the left-most y-axis
    # you utilize the conversion factor:
    par2.set_ylim(YLIM[2]*y3_to_y1,YLIM[3]*y3_to_y1)

    # set y-ticks, use np.arange for defined deltas
    # add a small increment to the last ylim value
    # to ensure that the last value will be a tick
    host.set_yticks(np.arange(YLIM[0],YLIM[1]+0.001,10.0))
    par1.set_yticks(np.arange(YLIM[2],YLIM[3]+0.001,10.0))
    par2.set_yticks(np.arange(YLIM[2]*y3_to_y1,YLIM[3]*y3_to_y1+0.001, 2.0))

    plt.show()

    你最终会得到这个情节:

    first figure

    您也可以尝试修改上面的示例以提供第二个图。一种想法是,减少 offset到零。然而,随着 axisartist , 某些滴答函数 are not supported .其中之一是指定刻度是在轴内还是在轴外。
    因此,对于第二个图,以下示例(基于 matplotlib: overlay plots with different scales?)是合适的。
    import numpy as np
    import matplotlib.pyplot as plt

    # initialize the three axis:
    fig = plt.figure()
    ax1 = fig.add_subplot(111)
    ax2 = ax1.twinx()
    ax3 = ax1.twinx()

    # data ratio for the two left y-axis:
    y3_to_y1 = 1/7.5

    # y-axis limits:
    YLIM = [0.0, 150.0,
    0.0, 150.0]

    # set up dummy data
    x = np.linspace(0,70.0,70.0)
    y1 = np.asarray([xi**2.0*0.032653 for xi in x])
    y2 = np.asarray([xi**2.0*0.02857 for xi in x])

    # plot the data
    ax1.plot(x,y1,'b')
    ax2.plot(x,y2,'r')

    # define the axis limits
    ax1.set_xlim(0.0,70.0)
    ax1.set_ylim(YLIM[0],YLIM[1])
    ax2.set_ylim(YLIM[2],YLIM[3])

    # when specifying the limits for the left-most y-axis
    # you utilize the conversion factor:
    ax3.set_ylim(YLIM[2]*y3_to_y1,YLIM[3]*y3_to_y1)

    # move the 3rd y-axis to the left (0.0):
    ax3.spines['right'].set_position(('axes', 0.0))

    # set y-ticks, use np.arange for defined deltas
    # add a small increment to the last ylim value
    # to ensure that the last value will be a tick
    ax1.set_yticks(np.arange(YLIM[0],YLIM[1]+0.001,10.0))
    ax2.set_yticks(np.arange(YLIM[2],YLIM[3]+0.001,10.0))
    ax3.set_yticks(np.arange(YLIM[2]*y3_to_y1,YLIM[3]*y3_to_y1+0.001, 2.0))

    # for both letf-hand y-axis move the ticks to the outside:
    ax1.get_yaxis().set_tick_params(direction='out')
    ax3.get_yaxis().set_tick_params(direction='out')

    plt.show()

    这导致了这个数字:

    second figure

    再次, set_tick_params(direction='out')不适用于 axisartist从第一个例子。
    有点违反直觉, y1y3刻度必须设置为 'out' .对于 y1 ,这是有道理的,对于 y3你必须记住它是从右手边的轴开始的。因此,当轴向左移动时,这些刻度会出现在外部(默认 'in' 设置)。

    关于python - 多个 y 轴转换刻度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25159495/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com