在matplotlib中使用2个不同的y轴时如何制作平方图?

时间:2015-10-24 02:44:45

标签: python matplotlib plot aspect-ratio

我想知道当我有2个y轴时如何使用matplotlib制作平方图。这是一个例子:

    import matplotlib.pyplot as plt
    import seaborn as sns

    gammas = sns.load_dataset("gammas")
    sns.set(context="paper", palette="colorblind", style="ticks")
    fig, ax1 = plot.subplots()
    sns.tsplot(gammas[(gammas["ROI"] == "IPS")].reset_index(), time="timepoint", unit="subject", value="BOLD signal", ci=95, color="#4477AA", legend=False, ax=ax1)
    ax1.set_xlabel("Timepoint")
    ax1.set_ylabel("BOLD signal (1)")
    ax1.spines["top"].set_visible(False)
    ax1.tick_params(top='off')
    ax2 = ax1.twinx()
    ax2.yaxis.tick_right()
    ax2.yaxis.set_label_position("right")
    sns.tsplot(gammas[(gammas["ROI"] == "AG")].reset_index(), time="timepoint", unit="subject", value="BOLD signal", ci=95, color="#CC6677", legend=False, ax=ax2)
    ax2.set_ylabel("BOLD signal (2)")
    ax2.spines["top"].set_visible(False)
    ax2.tick_params(top='off')
    # Set legend #
    ax2.legend([ax1.get_lines()[0], ax2.get_lines()[0]], ["IPS", "AG"], loc='upper left')
    plt.show()

如您所见,结果图不是平方的: enter image description here

到目前为止,我在plt.show()命令之前尝试了以下内容:

  • ax1.set_aspect(1. / ax1.get_data_ratio())
  • ax1.set_aspect(1. / ax1.get_data_ratio())ax2.set_aspect(1. / ax2.get_data_ratio())
  • 缩放ax2中使用的数据值,使它们在幅度上调整为ax1
  • 中的值
  • fig.set_size_inches(fig.get_size_inches()[0], fig.get_size_inches()[0])强制图像平方,但我用尺子测量了x和y轴,它们的大小不同(略有不同)

我使用的数据有2个不同的比例:第1个y轴的范围是0到250,而第2个的范围是0到100(这就是为什么我想到将ax2中使用的所有值乘以因子2.5 )。我确信有一些显而易见的事我没有看到,所以提前谢谢你。

1 个答案:

答案 0 :(得分:2)

您是否希望轴的长度相等,或者您是否希望轴上的缩放相等,这一点并不完全清楚。

为了获得方形宽高比,我创建了一个方形尺寸为fig = plt.figure(figsize=(5,5))的图形,这足以获得相同长度的轴。

enter image description here

为了在所有轴上获得相同的缩放比例,我添加了set_scaling()指令

enter image description here

import matplotlib.pyplot as plt
import seaborn as sns

gammas = sns.load_dataset("gammas")
sns.set(context="paper", palette="colorblind", style="ticks")
fig = plt.figure(figsize=(5,5))
ax1 = fig.add_subplot(111)
sns.tsplot(gammas[(gammas["ROI"] == "IPS")].reset_index(), time="timepoint", unit="subject", value="BOLD signal", ci=95, color="#4477AA", legend=False, ax=ax1)
ax1.set_xlabel("Timepoint")
ax1.set_ylabel("BOLD signal (1)")
ax1.spines["top"].set_visible(False)
ax1.tick_params(top='off')
ax2 = ax1.twinx()
ax2.yaxis.tick_right()
ax2.yaxis.set_label_position("right")
sns.tsplot(gammas[(gammas["ROI"] == "AG")].reset_index(), time="timepoint", unit="subject", value="BOLD signal", ci=95, color="#CC6677", legend=False, ax=ax2)
ax2.set_ylabel("BOLD signal (2)")
ax2.spines["top"].set_visible(False)
ax2.tick_params(top='off')
# Set legend #
ax2.legend([ax1.get_lines()[0], ax2.get_lines()[0]], ["IPS", "AG"], loc='upper left')
# set the aspect ratio so that the scaling is the same on all the axes
ax1.set_aspect('equal')
ax2.set_aspect('equal')