2

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

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.06to 1.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 轴: 在此处输入图像描述

注意:这个问题与这个不同,因为我不想用不同的比例来绘制。我只想添加具有相关值的第二个轴。

4

2 回答 2

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

在此处输入图像描述

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

在此处输入图像描述

于 2017-04-19T11:20:29.657 回答
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()

在此处输入图像描述

于 2017-04-19T10:40:37.177 回答