pythonmatplotlibtwiny

How to add a second x-axis


I have a very simple question. I need to have a second x-axis on my plot and I want that this axis has a certain number of tics that correspond to certain position of the first axis.

Let's try with an example. Here I am plotting the dark matter mass as a function of the expansion factor, defined as 1/(1+z), that ranges from 0 to 1.

semilogy(1/(1+z),mass_acc_massive,'-',label='DM')
xlim(0,1)
ylim(1e8,5e12)

I would like to have another x-axis, on the top of my plot, showing the corresponding z for some values of the expansion factor. Is that possible? If yes, how can I have xtics ax


Solution

  • I'm taking a cue from the comments in @Dhara's answer, it sounds like you want to set a list of new_tick_locations by a function from the old x-axis to the new x-axis. The tick_function below takes in a numpy array of points, maps them to a new value and formats them:

    import numpy as np
    import matplotlib.pyplot as plt
    
    fig = plt.figure()
    ax1 = fig.add_subplot(111)
    ax2 = ax1.twiny()
    
    X = np.linspace(0,1,1000)
    Y = np.cos(X*20)
    
    ax1.plot(X,Y)
    ax1.set_xlabel(r"Original x-axis: $X$")
    
    new_tick_locations = np.array([.2, .5, .9])
    
    def tick_function(X):
        V = 1/(1+X)
        return ["%.3f" % z for z in V]
    
    ax2.set_xlim(ax1.get_xlim())
    ax2.set_xticks(new_tick_locations)
    ax2.set_xticklabels(tick_function(new_tick_locations))
    ax2.set_xlabel(r"Modified x-axis: $1/(1+X)$")
    plt.show()
    

    enter image description here