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

时间:2017-04-19 10:34:55

标签: python matplotlib plot scatter multiple-axes

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

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轴的散点图: enter image description here

这是同一版本的组合版本,包括到目前为止讨论的第二个y轴: enter image description here

NB:这个问题与this不同,因为我不是试图用不同的尺度绘图。我只想添加一个带有相关值的第二个轴。

2 个答案:

答案 0 :(得分:3)

确保新轴上的数字与反转的位置相对应:

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()

enter image description here

您也可以为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')

enter image description here

答案 1 :(得分:1)

只需创建共享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()

enter image description here