Julia에서 색상을 점차적으로 변경하면서 플롯하는 방법

11356 단어 julialangJuliaPython3

하고 싶은 일



그래프를 복수 같은 캔버스(figure 쪽이 적절?)에 그릴 때, 각각의 선의 색을 바꾸고 싶네요.
일반적으로 Python과 Julia는 자동으로 색상을 변경하지만 깨끗한 그라데이션으로 조금씩 변경하면 깨끗합니다.
그래서, 그 방법은 python이라고 간단하게 찾을 수 있습니다만, Julia라고 좀처럼 발견되지 않았기 때문에, 기사로 하려고 하는 것입니다.

문제 설정


 f(x) = x^{n},  n = 1, 2, 3\cdots 10, x \in [-1, 1]

를 플롯하고 싶습니다. 단,
  • 플롯은 같은 그림에 그려집니다
  • n이 바뀌면 색상을 변경합니다.
  • 색은 점차적으로 (연속적으로) 변화한다

  • 하자.
    궁극적으로 이런 음모가 생기면 목표입니다.


    파이썬이라면



    Python(정확하게는 matplotlib)이라면 다음과 같이 거는다.
    import numpy as np
    from matplotlib import pyplot as plt
    from matplotlib import cm
    
    
    x = np.linspace(-1,1,100)
    
    N_max = 10
    for n in range(1,N_max+1,1):
        y = x**n
        color = cm.viridis(float(n/N_max))
        plt.plot(x,y, color=color, label = 'x to the {}th'.format(n))
    plt.legend(loc=0)
    



    포인트는 변화하는 지수 $n$를 $N_max$로 나눈 값을, 컬러맵 스킴에 인수로서 건네주는 곳이라고 생각한다.
    
    color = cm.viridis(0~1のfloatを与える)
    

    이렇게 하면 지정한 컬러맵 방식 중에서 색을 0~1의 스칼라 값으로 픽업할 수 있다.

    줄리아라면



    Julia(여기서는 Plots+GR이나 Plotly를 상정)라면 조금 어렵게 된다.
    왜냐하면, 컬러맵 스킴에 인수로서 0~1의 float를 건네줄 수 없기 때문이다.

    일단, 컬러맵 스킴은 c=:[なにかのscheme] 로 건네줄 수 있는 것 같기 때문에, 시험해 본다.
    # cを指定
    # 違う、そうじゃない
    x = LinRange(-1,1,100)
    p = plot()
    N_max = 10
    
    for n in 1:N_max
        y = map(xx-> xx^n, x)
        p = plot!(p,x,y,
                  c=:viridis,
                  label= string("x to the ", n,"th" ),
                  legend=:bottomright)
    end
    display(p)
    



    색이 전부 친숙해져 버렸다(´;ω;`)

    해결책



    이 Example 이 해결책이었습니다.

    아까 해결책을 쓰자.
    
    # cgradをうまくつかうのか〜
    x = LinRange(-1,1,100)
    p = plot()
    
    N_max = 10
    
    #ここで色の候補を作っておく
    C(g::ColorGradient) = RGB[g[z] for z=LinRange(0,1,N_max)]
    # colormap schemeの指定
    g = :viridis
    # 色のリスト作成(パイプ使用)
    colorlist  = cgrad(g) |> C 
    
    for n in 1:N_max
        y = map(xx-> xx^n, x)
        p = plot!(p,x,y, c=colorlist[n], # ここで色をピックアップ
             label= string("x to the ", n,"th" ),            legend=:bottomright) 
    
    end
    display(p)
    
    



    했어.

    뭐하는 거야



    뭐하고 있을까.
    정직한 이야기,
    #ここで色の候補を作っておく
    C(g::ColorGradient) = RGB[g[z] for z=LinRange(0,1,N_max)]
    

    무슨 일이 일어나고 있는지 잘 모르겠습니다.
    함수 C를 RGB의 리스트로서 정의하고 있습니다만, 그 안에 ColorGradient형의 g가 있어, 그 슬라이스로서 z가 사용되고 있어,,,

    솔직히 잘 모르겠다 ¯_(츠)_/¯
    다만, 기능으로서는 「지정의 컬러 맵( g )을 N_max 분할해, 그 리스트를 만드는 함수를 작성」같은 일을 하고 있다.

    포인트는 이 함수의 인수에 직접 g를 지정하고 있는 것이 아니라, cgrad 함수의 반환값을 넣는 것이다.
    # colormap schemeの指定
    g = :viridis
    # 色のリスト作成(パイプ使用)
    colorlist  = cgrad(g) |> C 
    

    여기에서는 실제로 컬러맵 스킴을 지정해, 색의 리스트를 실제로 작성하고 있다.|> 는 소위 파이프인 것에 주의. 함수 C의 인수로 cgrad(g)의 값이 들어 있습니다.

    마지막으로



    Matplotlib라면 할 수 있는데···라고 하는 때에는, Backend로서 PyPlot 사용하는 손도 있는 것이고, 아무래도 필요라고 하는 것은 아닐지도 모르고, 잘 모르지만, 우선 할 수 있었기 때문에 요시!

    좋은 웹페이지 즐겨찾기