복붙노트

[PYTHON] 내 컬러 바에 왜 선이 들어 있습니까?

PYTHON

내 컬러 바에 왜 선이 들어 있습니까?

편집 : 이것이 인기있는 게시물 인 것 같습니다. 여기에 나와있는 솔루션이 나와 잘 작동하는 것 같습니다. @ gazzar와 @mfra에 감사합니다.

cbar.solids.set_rasterized(True)
cbar.solids.set_edgecolor("face")

누구든지 내 컬러 바가 그 안에 선으로 보이는 이유를 알고 있습니까? 아니면 왜 색상 전환이 원활하지 않습니까? 분명히베이스 맵을 사용하고 있지만, matplotlib이 AFAICT라는 두꺼운 호출을하기 때문에 문제가되지 않습니다. 나는지도를 만드는 것과 같은 것을한다.

grays = plt.cm.get_cmap("Grays")
sc = mymap.scatter(xpoints, ypoints, s=sizes, c=color_values, cmap=grays, alpha=.75,
                   marker="o", zorder=10, vmin=0, vmax=1)
cbar = mymap.colorbar(sc, drawedges=True, location="bottom")

나는 알파가 없거나없이 시도했고 그 결과는 같았다. 아마도 내 color_values ​​배열이 충분히 좋지 않기 때문일 수 있습니까? 색상 막대에 매핑되는 기본 값을 어딘가에 설정할 수 있습니까? 나는 어떻게 볼 수 없으며 나는이 문제를 다른 곳에서 보지 못한다. 즉,이 문제없이 matplotlib show_colorbars 예제를 복제 할 수 있습니다.

해결법

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

    1.벡터 그래픽을 만들 경우 (http://matplotlib.org/api/pyplot_api.html?highlight=colorbar#matplotlib.pyplot.colorbar에서 가져옴) 다음을 시도해보십시오.

    벡터 그래픽을 만들 경우 (http://matplotlib.org/api/pyplot_api.html?highlight=colorbar#matplotlib.pyplot.colorbar에서 가져옴) 다음을 시도해보십시오.

    "일부 벡터 그래픽 뷰어 (svg 및 pdf)는 컬러 막대의 세그먼트 사이에 흰색 틈을 렌더링하는 것으로 알려져 있습니다.이 문제는 matplotlib이 아닌 뷰어의 버그로 인해 발생합니다. 해결 방법으로 색상 막대를 겹치는 세그먼트로 렌더링 할 수 있습니다.

    cbar = colorbar()
    cbar.solids.set_edgecolor("face")
    draw()
    

    그러나 이것은 다른 환경에서 부정적인 결과를 낳습니다. 특히 반투명 이미지 (알파 <1) 및 컬러 바 확장 기능을 사용하며 기본적으로 활성화되어 있지 않습니다 (문제 # 1188). "

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

    2.필자는 일반적으로 다음 줄을 추가하여 Eric Firing의 조언을 사용하여이 문제를 피하기 위해 색상 막대 내용을 래스터 화하는 것을 선호합니다.

    필자는 일반적으로 다음 줄을 추가하여 Eric Firing의 조언을 사용하여이 문제를 피하기 위해 색상 막대 내용을 래스터 화하는 것을 선호합니다.

    cbar.solids.set_rasterized(True) 
    

    이 대안은 아마도 투명도가있는 이미지에서는 실패하지만 대부분의 경우에 원하는 결과를 생성합니다.

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

    3.플롯에서 투명 (알파) 값을 사용하는 것처럼 보입니다. 나는이 같은 문제 (반투명 음모가 있지만, 단색으로 된 컬러 바를 원함)를 가지고 있었고,이 질문과 대답이 나를 위해 그것을 고쳤다! 참고 :

    플롯에서 투명 (알파) 값을 사용하는 것처럼 보입니다. 나는이 같은 문제 (반투명 음모가 있지만, 단색으로 된 컬러 바를 원함)를 가지고 있었고,이 질문과 대답이 나를 위해 그것을 고쳤다! 참고 :

    cbar.set_alpha(1)
    cbar.draw_all()
    
  4. ==============================

    4.나는 다른 코멘트에 주어진 두 설정을 시도했다.

    나는 다른 코멘트에 주어진 두 설정을 시도했다.

    cbar.solids.set_rasterized(True)
    cbar.solids.set_edgecolor("face")
    

    불행히도 나에게 도움이되지 못했다.

    그래서 나는 엄청난 해킹 인 완전히 다른 접근법을 시도했지만 최소한 일은 끝냈습니다. imshow에 알파를 전달하면 다른 이미지와 블렌딩하는 데 사용할 알파 값을 설정합니다. 높은 전력의 이유 때문에 (@mfra가 언급했듯이) 이것은 우리가 경멸하는 흰색 선을 만듭니다. 분명히 핵심은 imshow에 알파 값을 전달하지 않는 것입니다. 그러나 우리는 여전히 어떻게 든 colorbar를 만들 필요가 있습니다.

    따라서 임시 해결책으로 imshow에 칼라 맵을주기 전에 알파 블렌딩을 할 수 있습니다. 예를 들어 겨울 색상 표를 사용 해보자.

    import numpy as np
    import matplotlib as mpl
    import matplotlib.pyplot as plt
    
    xx, yy = np.meshgrid(np.linspace(-1, 1, 100), np.linspace(-1, 1, 100))
    zz = xx**2 + yy**2
    
    my_cmap_rgb = plt.get_cmap('winter')(np.arange(256))
    alpha = 0.5
    
    for i in range(3): # Do not include the last column!
        my_cmap_rgb[:,i] = (1 - alpha) + alpha*my_cmap_rgb[:,i]
    my_cmap = mpl.colors.ListedColormap(my_cmap_rgb, name='my_cmap')
    

    여기에 겨울을 기준으로 새로운 색상 맵 my_cmap_rgb를 만든 다음 비 알파 채널 (0, 1 및 2)을 편집하여 직접 알파 블렌딩을 수행합니다. 그러면이 새로운 색상 표를 사용하여 내 그림을 그릴 수 있습니다.

    f, ax = plt.subplots()
    cim = ax.imshow(zz, cmap=my_cmap)
    cbar = plt.colorbar(cim)
    ax.set_title("No lines and no transparency")
    

    이제이 트릭없이 얻을 수있는 이미지와 비교해보십시오.

    f, ax = plt.subplots()
    cim = ax.imshow(zz, cmap='winter', alpha=0.5)
    cbar = plt.colorbar(cim)
    ax.set_title("Lines and transparency")
    

    분명히 투명성이 필요 없다면 문제가 해결됩니다. 반면에 투명성이 필요하다면 한 가지 더 많은 해결 방법이 있습니다. 먼저 투명도가없는 이미지를 색칠하여 색 막대를 얻은 다음 투명도를 사용하여 색 막대를 그릴 수 있지만 색 막대는 사용하지 않습니다.

    f, ax = plt.subplots()
    cim = ax.imshow(zz, cmap=my_cmap)
    cbar = plt.colorbar(cim)
    plt.cla()  # Clears axis
    ax.plot(50,50, 'ko')
    ax.imshow(zz, cmap='winter', alpha=0.5)
    ax.set_title("No lines and transparency")
    

    그 결과 컬러 바에 선이없고 그래도 여전히 투명성을 유지하는 이미지가 생성됩니다. 대대적 인 해킹이 남아 있지만 적어도이 줄을 더 이상 참을 필요는 없습니다!

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

    5.시험:

    시험:

    cbar = mymap.colorbar(sc, drawedges=False, location="bottom")
    

    이제는 웹에서 잘 문서화되어 있습니다 (찾을 수 있음).

    *drawedges*   [ False | True ] If true, draw lines at color
                  boundaries.
    

    (matplotlib / lib / matplotlib / colorbar.py에서 가져옴) Drawedges를 True로 설정하면 그 선을 그려야한다고 생각합니다.

  6. ==============================

    6.다음은 우아하지 않더라도 다른 해결책이 될 수 있습니다.

    다음은 우아하지 않더라도 다른 해결책이 될 수 있습니다.

    In [1]: children = cbar.ax.get_children()
    In [2]: children
    Out[2]:
    [<matplotlib.collections.QuadMesh at 0x21783c41b70>,
     <matplotlib.collections.LineCollection at 0x21783bfdc18>,
     <matplotlib.patches.Polygon at 0x21783ba0588>,
     <matplotlib.patches.Polygon at 0x21783beef98>,
     <matplotlib.spines.Spine at 0x21783b77c88>,
     <matplotlib.spines.Spine at 0x21783b77470>,
     <matplotlib.spines.Spine at 0x21783b70c88>,
     <matplotlib.spines.Spine at 0x21783b70860>,
     <matplotlib.axis.XAxis at 0x21783b6ac50>,
     <matplotlib.axis.YAxis at 0x21783ba60f0>,
     <matplotlib.text.Text at 0x21783bc2198>,
     <matplotlib.text.Text at 0x21783bc2320>,
     <matplotlib.text.Text at 0x21783bc22b0>,
     <matplotlib.patches.Rectangle at 0x21783bc2358>]
    In [3]: obj = children[1]  # Get the LineCollection object
    In [4]: obj.set_linewidth(0)
    
  7. ==============================

    7.나에게 도움이되는 제안이 없기 때문에 colorbar 인스턴스에서 알파 채널을 제거했습니다.

    나에게 도움이되는 제안이 없기 때문에 colorbar 인스턴스에서 알파 채널을 제거했습니다.

    from matplotlib.colors import to_rgb
    
    lut = colorbar.solids.get_facecolor()
    bg_color = to_rgb('white')
    lut[:, :3] *= lut[:, 3:]
    lut[:, :3] += (1 - lut[:, 3:]) * bg_color
    lut[:, 3] = 1.
    colorbar.solids.set_facecolor(lut)
    

    얼굴색에 액세스하려면 먼저 색상 막대를 그려야했습니다.

  8. from https://stackoverflow.com/questions/15003353/why-does-my-colorbar-have-lines-in-it by cc-by-sa and MIT license