首页 > 解决方案 > x 和 y 轴刻度从原点偏移

问题描述

我有多个相互堆叠的图,并且有一个共同的 x 轴。x 轴的值从 70 到 6225。当我尝试给出范围 (50,6250) 时,输出是从 50 到 6050,但 50 不是从原点开始的。此外,它也不会以 6250 结束。如何实现这一点。我希望 y 轴刻度在下一个堆栈开始之前从一个绘图的原点运行到它的结尾。

我附上了 MWE 和相同的图像

import numpy as np
import pandas as pd
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
from matplotlib.ticker import MultipleLocator
from matplotlib.colors import ListedColormap, LinearSegmentedColormap
import matplotlib.gridspec as gridspec
import pylab 
import matplotlib.patches as mpatches
import matplotlib.pyplot as plt 
from matplotlib.lines import Line2D
import matplotlib.lines as mlines
from matplotlib.ticker import FormatStrFormatter

def fit_data():

    fig = plt.figure(1,figsize=(15,15))

    ax1= fig.add_subplot(811,)
    ax1.scatter(data1['D'], data1['F'],  marker='o', color='red', s=15)
    ax1.errorbar(data1['D'], data1['F'], data1['eF'], fmt='.', ecolor='black',color='red', elinewidth=1,capsize=3)

    ax2 = fig.add_subplot(812, sharex=ax1 )
    ax2.scatter(data2['D'], data2['F'],  marker='o', color='blue', s=15)
    ax2.errorbar(data2['D'], data2['F'], data2['eF'], fmt='.', ecolor='black',color='blue', elinewidth=1,capsize=3)

    ax3 = fig.add_subplot(813, sharex=ax1 )
    ax3.scatter(data3['D'], data3['F'],  marker='o', color='green', s=15)
    ax3.errorbar(data3['D'], data3['F'], data3['eF'], fmt='.', ecolor='black',color='green', elinewidth=1,capsize=3)

    ax4 = fig.add_subplot(814, sharex=ax1 )
    ax4.scatter(data4['D'], data4['F'],  marker='o', color='sienna', s=15)
    ax4.errorbar(data4['D'], data4['F'], data4['eF'], fmt='.', ecolor='black',color='sienna', elinewidth=1,capsize=3)

    ax5 = fig.add_subplot(815, sharex=ax1 )
    ax5.scatter(data5['D'], data5['F'],  marker='o', color='brown', s=15)
    ax5.errorbar(data5['D'], data5['F'], data5['eF'], fmt='.', ecolor='black',color='brown', elinewidth=1,capsize=3)

    ax6 = fig.add_subplot(816, sharex=ax1 )
    ax6.scatter(data6['D'], data6['F'],  marker='o', color='gold', s=15)
    ax6.errorbar(data6['D'], data6['F'], data6['eF'], fmt='.', ecolor='black',color='gold', elinewidth=1,capsize=3)

    ax7 = fig.add_subplot(817, sharex=ax1 )
    ax7.scatter(data7['D'], data7['F'],  marker='o', color='olive', s=15)
    ax7.errorbar(data7['D'], data7['F'], data7['eF'], fmt='.', ecolor='black',color='olive', elinewidth=1,capsize=3)

    ax8 = fig.add_subplot(818, sharex=ax1 )
    ax8.scatter(data8['D'], data8['F'],  marker='o', color='greenyellow', s=15)
    ax8.errorbar(data8['D'], data8['F'], data8['eF'], fmt='.', ecolor='black',color='greenyellow', elinewidth=1,capsize=3)
    fig.subplots_adjust(hspace=0) # remove vertical space between subplots

    red_line = mlines.Line2D([], [], color='red', marker='o', markersize=5, label='1350 $\AA$')
    ax1.legend(bbox_to_anchor=(1, 1), loc=1, borderaxespad=0, handles=[red_line])
    red_line = mlines.Line2D([], [], color='blue', marker='o', markersize=5, label='1450 $\AA$')
    ax2.legend(bbox_to_anchor=(1, 1), loc=1, borderaxespad=0, handles=[red_line])
    red_line = mlines.Line2D([], [], color='green', marker='o', markersize=5, label='1710 $\AA$')
    ax3.legend(bbox_to_anchor=(1, 1), loc=1, borderaxespad=0, handles=[red_line])
    red_line = mlines.Line2D([], [], color='sienna', marker='o', markersize=5, label='1800 $\AA$')
    ax4.legend(bbox_to_anchor=(1, 1), loc=1, borderaxespad=0, handles=[red_line])
    red_line = mlines.Line2D([], [], color='brown', marker='o', markersize=5, label='2425 $\AA$')
    ax5.legend(bbox_to_anchor=(1, 1), loc=1, borderaxespad=0, handles=[red_line])
    red_line = mlines.Line2D([], [], color='gold', marker='o', markersize=5, label='2625 $\AA$')
    ax6.legend(bbox_to_anchor=(1, 1), loc=1, borderaxespad=0, handles=[red_line])
    red_line = mlines.Line2D([], [], color='olive', marker='o', markersize=5, label='2875 $\AA$')
    ax7.legend(bbox_to_anchor=(1, 1), loc=1, borderaxespad=0, handles=[red_line])
    red_line = mlines.Line2D([], [], color='orange', marker='o', markersize=5, label='3025 $\AA$')   
    ax8.legend(bbox_to_anchor=(1, 1), loc=1, borderaxespad=0, handles=[red_line])

    for ax in [ax1,ax2,ax3,ax5,ax6,ax7]:
        ax.tick_params('x', bottom=False, labelbottom=False)

    ax8.xaxis.set_major_formatter(FormatStrFormatter('%g'))
    ax8.xaxis.set_ticks(np.arange(50,6250))



    plt.savefig("all.jpeg")
    plt.savefig("all.pdf")
    fig.set_size_inches(w=15,h=15)
    plt.show()
    plt.close()

fit_data()

在此处输入图像描述

标签: matplotlibjupyter-notebookjupyter

解决方案


要设置子图的限制,您可以这样做

for ax in [ax1, ax2, ax3, ax5, ax6, ax7, ax8]:
    ax.set_xlim([50, 6250])

并将刻度设置为所需的序列(50、550、1050,...)可以通过

ax8.set_xticks(np.arange(50, 6250, 500))

或者包括你可以使用的终点

np.hstack([np.arange(50, 6250, 500), [6250]])

推荐阅读