복붙노트

[PYTHON] matplotlib에 두 번째 x 축을 추가하는 방법

PYTHON

matplotlib에 두 번째 x 축을 추가하는 방법

나는 아주 간단한 질문이있다. 내 플롯에서 두 번째 x 축을 가져야하고이 축에 첫 번째 축의 특정 위치에 해당하는 특정 수의 틱이 있어야합니다.

예를 들어 보겠습니다. 여기서 암흑 물질 질량을 1 / (1 + z)로 정의 된 확장 인자의 함수로 플롯하고 있는데, 0에서 1까지의 범위입니다.

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

내 플롯 상단에 확장 요소의 일부 값에 해당하는 z를 표시하는 다른 x 축을 가져야합니다. 그게 가능하니? 그렇다면 xtics ax를 어떻게 가질 수 있습니까?

해결법

  1. ==============================

    1.@ Dhara의 답변에있는 주석에서 큐를 가져오고 있습니다. 예전 X 축에서 새 X 축까지의 함수에 의해 new_tick_locations 목록을 설정하려는 것 같습니다. 아래의 tick_function은 numpy 배열을 사용하여 새로운 값으로 매핑하고 형식을 지정합니다.

    @ Dhara의 답변에있는 주석에서 큐를 가져오고 있습니다. 예전 X 축에서 새 X 축까지의 함수에 의해 new_tick_locations 목록을 설정하려는 것 같습니다. 아래의 tick_function은 numpy 배열을 사용하여 새로운 값으로 매핑하고 형식을 지정합니다.

    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()
    

  2. ==============================

    2.twiny를 사용하여 2 개의 x 축 스케일을 만들 수 있습니다. 예 :

    twiny를 사용하여 2 개의 x 축 스케일을 만들 수 있습니다. 예 :

    import numpy as np
    import matplotlib.pyplot as plt
    
    fig = plt.figure()
    ax1 = fig.add_subplot(111)
    ax2 = ax1.twiny()
    
    a = np.cos(2*np.pi*np.linspace(0, 1, 60.))
    
    ax1.plot(range(60), a)
    ax2.plot(range(100), np.ones(100)) # Create a dummy plot
    ax2.cla()
    plt.show()
    

    참고 : http://matplotlib.sourceforge.net/faq/howto_faq.html#multiple-y-axis-scales

    산출:

  3. ==============================

    3.Dhara의 답변에 대한 귀하의 질문에 대답 : "나는 두 번째 x 축에 이러한 틱을 원합니다 : (7,8,99) x 축 위치 10, 30, 40에 해당합니다. 어떤 방법으로 가능합니까?" 예, 그렇습니다.

    Dhara의 답변에 대한 귀하의 질문에 대답 : "나는 두 번째 x 축에 이러한 틱을 원합니다 : (7,8,99) x 축 위치 10, 30, 40에 해당합니다. 어떤 방법으로 가능합니까?" 예, 그렇습니다.

    import numpy as np
    import matplotlib.pyplot as plt
    
    fig = plt.figure()
    ax1 = fig.add_subplot(111)
    
    a = np.cos(2*np.pi*np.linspace(0, 1, 60.))
    ax1.plot(range(60), a)
    
    ax1.set_xlim(0, 60)
    ax1.set_xlabel("x")
    ax1.set_ylabel("y")
    
    ax2 = ax1.twiny()
    ax2.set_xlabel("x-transformed")
    ax2.set_xlim(0, 60)
    ax2.set_xticks([10, 30, 40])
    ax2.set_xticklabels(['7','8','99'])
    
    plt.show()
    

    당신은 얻을 것이다:

  4. ==============================

    4.상단 축이 하단 축의 틱 값의 함수가되도록하려면 :

    상단 축이 하단 축의 틱 값의 함수가되도록하려면 :

    import matplotlib.pyplot as plt
    
    fig, ax1 = plt.subplots()
    
    ax1 = fig.add_subplot(111)
    
    ax1.plot(range(5), range(5))
    
    ax1.grid(True)
    
    ax2 = ax1.twiny()
    ax1Xs = ax1.get_xticks()
    
    ax2Xs = []
    for X in ax1Xs:
        ax2Xs.append(X * 2)
    
    ax2.set_xticks(ax1Xs)
    ax2.set_xbound(ax1.get_xbound())
    ax2.set_xticklabels(ax2Xs)
    
    title = ax1.set_title("Upper x-axis ticks are lower x-axis ticks doubled!")
    title.set_y(1.1)
    fig.subplots_adjust(top=0.85)
    
    fig.savefig("1.png")
    

    제공 :

  5. ==============================

    5.나는 평판이 낮아 논평 대신 답을 써야한다. 나는 Matteo와 비슷한 문제가 있었다. 차이점은 내 첫 번째 x 축에서 두 번째 x 축까지의지도가 없었으며 x 값만 나타났습니다. 그래서 두 번째 x 축에 데이터를 직접 설정하고 틱 (tick)이 아닌 원하는 축을 설정하려고합니다. 그러나 axes.set_xdata는 없습니다. Dhara의 답변을 수정하여이 작업을 수행 할 수있었습니다.

    나는 평판이 낮아 논평 대신 답을 써야한다. 나는 Matteo와 비슷한 문제가 있었다. 차이점은 내 첫 번째 x 축에서 두 번째 x 축까지의지도가 없었으며 x 값만 나타났습니다. 그래서 두 번째 x 축에 데이터를 직접 설정하고 틱 (tick)이 아닌 원하는 축을 설정하려고합니다. 그러나 axes.set_xdata는 없습니다. Dhara의 답변을 수정하여이 작업을 수행 할 수있었습니다.

    ax2.lines = []
    

    사용하는 대신:

    ax2.cla()
    

    사용 중에도 ax1에서 내 음모를 삭제했습니다.

  6. from https://stackoverflow.com/questions/10514315/how-to-add-a-second-x-axis-in-matplotlib by cc-by-sa and MIT license