<p>使用<code>.add_artist(matplotlib.axis.YAxis(ax1))</code>添加额外的轴比使用<code>.twinx()</code>更健壮。在</p>
<p>当您只需要一个额外的<em>轴</em>时,用<code>.twinx()</code>添加一个extras<em>轴</em>对象似乎有些过头了。使用问题中提出的<code>.twinx()</code>也有一个缺点,即第二个轴与数据分离,因此您需要一些技巧使其与数据和另一个轴相对应,例如更改<code>ylim</code>(在其他答案中以各种方式完成),但是,一旦您更改原始轴上的<code>ylim</code>,就会中断。在</p>
<p>见下文。我更改了<code>to_percent</code>函数中的第一行,以获得非常好的数字格式和名为“addsecondy-AXIS”的块。在</p>
<pre><code>from datetime import datetime
from dateutil.relativedelta import relativedelta
from numpy import nan, arange
import matplotlib
import matplotlib.pyplot as plt
from matplotlib.ticker import FuncFormatter
import sys
twentytwo = {}
twentytwo[60.0] = [578, 85, 14, 5, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
totNEA2014 = 1266
def to_percent(y, position):
# Ignore the passed in position. This has the effect of scaling the default
# tick locations.
s = '%g' % (100 * (y/totNEA2014))
if matplotlib.rcParams['text.usetex'] == True:
return s + r'$\%$'
else:
return s + '%'
# Plot Details
bar_width = 0.18
line_width = 1
opacity = 1.
centre_bar_positions = arange(20)
zeros = [0 for k in range(len(centre_bar_positions))]
# Make bar plots
fig = plt.figure(figsize=[12, 9])
ax1 = fig.add_subplot(111)
bar_60_22 = plt.bar(centre_bar_positions, twentytwo[60.0], bar_width, bottom=10**-1, alpha=opacity, color='green', log=True, label='V < 22')
plt.title("Some Place")
plt.ylabel("Number of NEAs")
plt.xlabel("Number of apparitions")
ax1.set_ylim([ax1.set_ylim()[0], totNEA2014])
ax1.set_yscale("log")
plt.legend(loc='best')
# ADD SECOND Y-AXIS
extra_axis = matplotlib.axis.YAxis(ax1)
extra_axis.tick_right()
formatter = FuncFormatter(to_percent)
extra_axis.set_major_formatter(formatter)
extra_axis.set_ticks([totNEA2014*10**p for p in range(-4, 1)])
extra_axis.set_label_text("Percentage of NEAs discovered in 2014")
extra_axis.set_label_position('right')
ax1.add_artist(extra_axis)
plt.xlim([.6, 5.8])
plt.show()
</code></pre>