【问题标题】:How to create equal number of primary and secondary y-axes ticks with matplotlib?如何使用 matplotlib 创建相等数量的主要和次要 y 轴刻度?
【发布时间】:2015-02-17 16:36:24
【问题描述】:

我一直在努力创建一个带有辅助轴的绘图,以便主轴和辅助轴具有相同数量的主要刻度,以便网格线重合。在下图中,我在辅助轴上显示了网格线来说明问题。

通过手动设置辅助轴限制,我得到了这个图,这是我想要的输出:

我已经包含了可重现的代码:

import numpy as np
import matplotlib.pyplot as plt
data = np.loadtxt('data.dat', skiprows=2, delimiter=',', unpack=True).transpose()
time = data[:,0]
pressure = data[:,1]
lift = data[:,2]
figure_pressure_trace = plt.figure(figsize=(5.15, 5.15))
figure_pressure_trace.clf()
P_vs_t = plt.subplot(111)
P_vs_t.plot(time, pressure, linewidth=1.0)
P_vs_t.set_ylabel(r'\textit{Pressure (bar)}', labelpad=6)
P_vs_t.set_xlabel(r'\textit{Time (ms)}', labelpad=6)
lift_vs_t = P_vs_t.twinx()
lift_vs_t.plot(time, lift, color='#4DAF4A')
lift_vs_t.set_ylabel(r'\textit{Lift(mm)}', labelpad=6)
plt.show()
plt.close()

数据可用here

更新:

我创建了一个函数来创建相等数量的刻度,整个代码是:

import numpy as np
import matplotlib.pyplot as plt

def equal_y_ticks(primary, secondary):
    y_min_primary, y_max_primary = primary.get_ybound()
    y_min_secondary, y_max_secondary = secondary.get_ybound()
    primary_ticks = len(primary.yaxis.get_major_ticks())
    secondary_ticks = len(secondary.yaxis.get_major_ticks())
    primary_spacing = (y_max_primary - y_min_primary) / (primary_ticks - 1)
    secondary_spacing = (y_max_secondary - y_min_secondary) / (secondary_ticks - 1)
    ticks = max(primary_ticks, secondary_ticks)
    if secondary_ticks < primary_ticks:
        y_max_secondary = y_min_secondary + (primary_ticks * secondary_spacing)
        secondary.yaxis.set_ticks(np.arange(y_min_secondary, y_max_secondary, secondary_spacing))
    else:
        y_max_primary = y_min_primary + (secondary_ticks * primary_spacing)
        primary.yaxis.set_ticks(np.arange(y_min_primary, y_max_primary, primary_spacing))

data = np.loadtxt('data.dat', skiprows=2, delimiter=',', unpack=True).transpose()
time = data[:,0]
pressure = data[:,1]
lift = data[:,2]
figure_pressure_trace = plt.figure(figsize=(5.15, 5.15))
figure_pressure_trace.clf()
P_vs_t = plt.subplot(111)
P_vs_t.plot(time, pressure, linewidth=1.0)
P_vs_t.set_ylabel(r'\textit{Pressure (bar)}', labelpad=6)
P_vs_t.set_xlabel(r'\textit{Time (ms)}', labelpad=6)
lift_vs_t = P_vs_t.twinx()
lift_vs_t.plot(time, lift, color='#4DAF4A')
equal_y_ticks(P_vs_t, lift_vs_t)
lift_vs_t.set_ylabel(r'\textit{Lift(mm)}', labelpad=6)
plt.show()
plt.close()

但是这个函数给了我这样的图(对于一些数据):

【问题讨论】:

标签: python matplotlib plot


【解决方案1】:

我想你在找LinearLocator (docs)

import matplotlib.pyplot as plt
from matplotlib import ticker as mtick
fig, ax = plt.subplots()
ax2 = ax.twinx()

ax.yaxis.set_major_locator(mtick.LinearLocator(5))
ax2.yaxis.set_major_locator(mtick.LinearLocator(5))

ax.set_ylim(0, 15)
ax2.set_ylim(0, 1500)
ax.yaxis.grid(True, lw=7, color='g', ls='--')
ax2.yaxis.grid(True, color='k', ls='-', lw=3)

这将在最小值和最大值之间放置 N 个均匀间隔的刻度。

【讨论】:

    猜你喜欢
    • 2020-01-15
    • 2012-09-24
    • 1970-01-01
    • 1970-01-01
    • 2018-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-29
    相关资源
    最近更新 更多