복붙노트

[PYTHON] Python / Matplotlib을 사용하여 색상 표를 기반으로 한 (극지색) 색상환 플롯

PYTHON

Python / Matplotlib을 사용하여 색상 표를 기반으로 한 (극지색) 색상환 플롯

필자는 Python에서 컬러 휠을 만들려고합니다. Matplotlib을 사용하는 것이 좋습니다. 다음은 정상적으로 작동합니다.

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

xval = np.arange(0, 2*pi, 0.01)
yval = np.ones_like(xval)

colormap = plt.get_cmap('hsv')
norm = mpl.colors.Normalize(0.0, 2*np.pi)

ax = plt.subplot(1, 1, 1, polar=True)
ax.scatter(xval, yval, c=xval, s=300, cmap=colormap, norm=norm, linewidths=0)
ax.set_yticks([])

그러나이 시도에는 두 가지 심각한 단점이 있습니다.

첫 번째, 결과 그림을 벡터 (figure_1.svg)로 저장할 때 색상환은 다른 (x, y) 값에 해당하는 621 개의 다른 모양으로 구성됩니다 (예상대로). 결과는 원과 비슷하지만 실제로는 아닙니다. 몇 가지 경로 점과 베 지어 곡선으로 정의되는 실제 원을 사용하는 것이 좋습니다. matplotlib.patches.Circle. 이것은 나에게 '올바른'방법으로 보이고 그 결과는 더 멋지게 보일 것입니다 (밴딩이없고 더 좋은 그라데이션, 더 나은 앤티 앨리어싱).

둘째로 (관련하여), 마지막 플롯 마커 (2 * pi 이전의 마지막 몇 마디)는 처음 몇 마디와 중첩됩니다. 픽셀 렌더링에서는 매우보기가 어렵지만, 벡터 기반 렌더링을 확대하면 처음 몇 장의 디스크가 마지막으로 겹쳐서 표시됩니다.

다른 마커 (. 또는 |)를 사용해 보았지만 두 번째 문제는 해결되지 않았습니다.

최종선 : 적절한 벡터 / 베 지어 커브 방식으로 정의 된 파이썬 / 매트 플로트 라이브러리에서 원을 그릴 수 있습니까? 그리고 컬러 맵에 따라 정의 된 가장자리 색이 있습니다 (또는 실패하면 임의의 색 그라데이션)?

해결법

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

    1.내가 찾은 한 가지 방법은 컬러 맵을 생성 한 다음 극좌표 축에 투영하는 것입니다. 여기에 작동하는 예제가 있습니다 - 그것은 (더러워진) 해킹을 포함합니다. 한계를 조정하거나 주위를 둘러보기 위해 자신의 Transform을 작성하는 (열심히) 방법이있을 것이라고 확신하지만, 아직 그 사실을 관리하지는 못했습니다. 나는 Normalize에 대한 호출의 범위가 그렇게 할 것이라고 생각했지만 분명히 그렇지는 않습니다.

    내가 찾은 한 가지 방법은 컬러 맵을 생성 한 다음 극좌표 축에 투영하는 것입니다. 여기에 작동하는 예제가 있습니다 - 그것은 (더러워진) 해킹을 포함합니다. 한계를 조정하거나 주위를 둘러보기 위해 자신의 Transform을 작성하는 (열심히) 방법이있을 것이라고 확신하지만, 아직 그 사실을 관리하지는 못했습니다. 나는 Normalize에 대한 호출의 범위가 그렇게 할 것이라고 생각했지만 분명히 그렇지는 않습니다.

    import matplotlib.pyplot as plt
    import numpy as np
    from matplotlib import cm
    import matplotlib as mpl
    
    fig = plt.figure()
    
    display_axes = fig.add_axes([0.1,0.1,0.8,0.8], projection='polar')
    display_axes._direction = 2*np.pi ## This is a nasty hack - using the hidden field to 
                                      ## multiply the values such that 1 become 2*pi
                                      ## this field is supposed to take values 1 or -1 only!!
    
    norm = mpl.colors.Normalize(0.0, 2*np.pi)
    
    # Plot the colorbar onto the polar axis
    # note - use orientation horizontal so that the gradient goes around
    # the wheel rather than centre out
    quant_steps = 2056
    cb = mpl.colorbar.ColorbarBase(display_axes, cmap=cm.get_cmap('hsv',quant_steps),
                                       norm=norm,
                                       orientation='horizontal')
    
    # aesthetics - get rid of border and axis labels                                   
    cb.outline.set_visible(False)                                 
    display_axes.set_axis_off()
    plt.show() # Replace with plt.savefig if you want to save a file
    

    이것은 생산한다

    휠이 아닌 링이 필요한 경우 plt.show () 또는 plt.savefig 앞에이 문자를 사용하십시오.

    display_axes.set_rlim([-1,1])
    

    이것은 준다.

    덧글에서 @EelkeSpaak에 따라 - OP별로 SVG로 그래픽을 저장하면 결과 그래픽 작업에 대한 팁이 있습니다. 결과 SVG 이미지의 작은 요소는 닿아 있고 겹치지 않습니다. 이로 인해 일부 렌더러에서 희미한 회색 선이 생깁니다 (Inkscape, Adobe Reader, 아마도 인쇄되지 않음). 이에 대한 간단한 해결책은, 예를 들어,를 사용하여 각각의 그래디언트 요소 각각에 작은 (예 : 120 %) 스케일링을 적용하는 것이다. 잉크 스케이프 또는 일러스트 레이터. 각 요소에 개별적으로 변형을 적용해야합니다 (언급 된 소프트웨어는 전체 도면이 아닌 자동으로 수행 할 수있는 기능을 제공함). 그렇지 않으면 효과가 없습니다.

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

    2.칼라 휠을 만들 필요가 있었고 rsnape의 솔루션을 matplotlib 2.1과 호환되도록 업데이트하기로 결정했습니다. 컬러 막대 객체를 축에 배치하는 대신 극좌표 플롯에 극좌표 색 메쉬를 그릴 수 있습니다.

    칼라 휠을 만들 필요가 있었고 rsnape의 솔루션을 matplotlib 2.1과 호환되도록 업데이트하기로 결정했습니다. 컬러 막대 객체를 축에 배치하는 대신 극좌표 플롯에 극좌표 색 메쉬를 그릴 수 있습니다.

    import matplotlib.pyplot as plt
    import numpy as np
    from matplotlib import cm
    import matplotlib as mpl
    
    #If displaying in a Jupyter notebook:
    %matplotlib inline 
    
    #Generate a figure with a polar projection
    fg = plt.figure(figsize=(8,8))
    ax = fg.add_axes([0.1,0.1,0.8,0.8], projection='polar')
    
    #define colormap normalization for 0 to 2*pi
    norm = mpl.colors.Normalize(0, 2*np.pi) 
    
    #Plot a color mesh on the polar plot
    #with the color set by the angle
    
    n = 200  #the number of secants for the mesh
    t = np.linspace(0,2*np.pi,n)   #theta values
    r = np.linspace(.6,1,2)        #raidus values change 0.6 to 0 for full circle
    rg, tg = np.meshgrid(r,t)      #create a r,theta meshgrid
    c = tg                         #define color values as theta value
    im = ax.pcolormesh(t, r, c.T,norm=norm)  #plot the colormesh on axis with colormap
    ax.set_yticklabels([])                   #turn of radial tick labels (yticks)
    ax.tick_params(pad=15,labelsize=24)      #cosmetic changes to tick labels
    ax.spines['polar'].set_visible(False)    #turn off the axis spine.
    

    그것은 이것을 준다 :

  3. from https://stackoverflow.com/questions/31940285/plot-a-polar-color-wheel-based-on-a-colormap-using-python-matplotlib by cc-by-sa and MIT license