【问题标题】:Increase space between secondary y axis and x axis?增加次要y轴和x轴之间的空间?
【发布时间】:2020-12-01 11:05:52
【问题描述】:

我用 python 绘制了一个带有两个 y 轴的图形。但是,我希望两条线之间有更多的空间,辅助 y 轴位于图表的顶部。

这是我的代码:

x = data['Data'].tolist() 
y = data['Excess Return'].tolist()
z=data['EPU shock'].tolist()

fig, ax1 = plt.subplots()
ax2 = ax1.twinx()
curve1 = ax1.plot(x, y, label='Excess Return', color='r')
curve2 = ax2.plot(x, z, label='EPU shock', color='b')

lines_1, labels_1 = ax1.get_legend_handles_labels()
lines_2, labels_2 = ax2.get_legend_handles_labels()
lines = lines_1 + lines_2
labels = labels_1 + labels_2
ax1.legend(lines, labels, loc="lower center", borderaxespad=-5, ncol=2)
plt.title("European Union")
plt.show()

输出:

但我想要这样的东西:

【问题讨论】:

  • 这两张图到底有什么区别?我看不到任何
  • 这些图片是一样的
  • 我已经更正了
  • 您可以尝试以数据不重叠的方式设置 yticks、yticks label 和 ylim。它也可以通过根据数据的平均值和标准来确定值来自动化。

标签: python matplotlib graph


【解决方案1】:

两个子图设置是否适合您?

import matplotlib.pyplot as plt
import numpy as np

# Dummy data.
x = np.arange(2000, 2020, 1)
y1 = np.sin(x)
y2 = np.cos(x/2)

# We create a two-subplots figure and hide the boundary between the two Axes.
fig, (ax1, ax_temporary) = plt.subplots(2, 1)
ax2 = ax_temporary.twinx()
for spine in (ax1.spines["bottom"], ax_temporary.spines["top"], ax2.spines["top"]):
    spine.set_visible(False)
ax1.xaxis.set_visible(False)
ax_temporary.yaxis.set_visible(False)
fig.subplots_adjust(hspace=0) # No space left!

# Create curves and legend.
curve1, = ax1.plot(x, y1, label='Excess Return', color='r')
curve2, = ax2.plot(x, y2, label='EPU shock', color='b')
lines_1, labels_1 = ax1.get_legend_handles_labels()
lines_2, labels_2 = ax2.get_legend_handles_labels()
lines = lines_1 + lines_2
labels = labels_1 + labels_2
ax2.legend(lines, labels, loc="lower center", borderaxespad=-5, ncol=2) # Legend on ax2 instead of ax1.

ax1.set_title("European Union")
fig.show()

【讨论】:

    【解决方案2】:

    调整限制是否适合您?

    fig, ax1 = plt.subplots()
    ax2 = ax1.twinx() # open second y-axis
    
    line1, = ax1.plot([0, 1, 2], [0, 1, 2], "b-", label="Line 1")
    line2, = ax2.plot([0, 1, 2,], [10, 13, 12], "r-", label="Line 2")
    
    # set limits
    ax2.set_ylim( (-10,14) )
    plt.show()
    

    【讨论】: