Matplotlib:添加双 y 轴而不在图中使用其值

Matplotlib: add twin y axis without using its values in the plots

这是为了澄清问题标题。假设你有四个整数列表,你想用它们生成散点图:

a=[3,7,2,8,12,17]
b=[9,4,11,7,6,3]
c=[9,3,17,13,10,5]
d=[5,1,1,14,5,8]

为了简单起见,您还有一个函数 f(x)=1/x,它适用于所有列表,因此:

from __future__ import division
a1=[1/i for i in a]
b1=[1/i for i in b]
c1=[1/i for i in c]
d1=[1/i for i in d]

我的问题:如何添加第二个y轴,知道函数返回的值范围从0.061.0不使用散点图中的任何 a1、b1、c1、d1 列表?

我的意思是:如果您以传统方式生成以下散点图,那么如何根据 a1、b1、c1、d1 的值添加第二个 y 轴,而无需使用任何系列他们在情节本身?

import matplotlib.pyplot as plt
plt.scatter(a,b,c='red',label='reds')
plt.scatter(c,d,c='blue',label='blues')
plt.legend(loc='best')

这是没有第二个 y 轴的散点图:

这是同一版本的合成版本,包括目前讨论的第二个 y 轴:

注意: 这个问题与 this 的不同之处在于我并没有尝试用不同的比例进行绘图。我只想添加具有相关值的第二个轴。

只需创建共享 y 轴并为新轴设置所需的限制和刻度,如下所示:

import matplotlib.pylab as plt
import numpy as np

a=[3,7,2,8,12,17]
b=[9,4,11,7,6,3]
c=[9,3,17,13,10,5]
d=[5,1,1,14,5,8]

plt.scatter(a,b,c='red',label='reds')
plt.scatter(c,d,c='blue',label='blues')
plt.legend(loc='best')
ax = plt.gca()
# make shared y axis
ax2 = ax.twinx()
# set limits for shared axis
ax2.set_ylim([0,1])
# set ticks for shared axis
plt.yticks(np.arange(0.06, 1, 0.14))
plt.show()

确保新轴上的数字与其倒数对应的位置:

import matplotlib.pylab as plt

a=[3,7,2,8,12,17]
b=[9,4,11,7,6,3]
c=[9,3,17,13,10,5]
d=[5,1,1,14,5,8]

fig = plt.figure()
ax = fig.add_subplot(111)

ax.scatter(a,b,c='red',label='reds')
ax.scatter(c,d,c='blue',label='blues')
ax.legend(loc='best')
ax.set_ylabel('Y')
# make shared y axis
axi = ax.twinx()
# set limits for shared axis
axi.set_ylim(ax.get_ylim())
# set ticks for shared axis
inverse_ticks = []
label_format = '%.3f'
for tick in ax.get_yticks():
    if tick != 0:
        tick = 1/tick
    inverse_ticks.append(label_format % (tick,))
axi.set_yticklabels(inverse_ticks)
axi.set_ylabel('1/Y')
fig.tight_layout()
fig.show()

你也可以为 X 轴做:

# make shared x axis
xaxi = ax.twiny()
# set limits for shared axis
xaxi.set_xlim(ax.get_xlim())
# set ticks for shared axis
inverse_ticks = []
label_format = '%.3f'
for tick in ax.get_xticks():
    if tick != 0:
        tick = 1/tick
    inverse_ticks.append(label_format % (tick,))
xaxi.set_xticklabels(inverse_ticks)
xaxi.set_xlabel('1/X')