2014-10-08 7 views
2

주어진 색상 사이에서 대수적으로 보간되는 matplitlib 색상 맵을 정의 할 수 있습니까?matplotlib의 로그 칼라 맵

배경 : imshow(...)하기 matplotlib 통해 명령의 배열을 플로팅하면 색상 맵은 각 데이터 값으로 색을 지정하는 데 사용되는. 종종 사전 정의 된 색상 맵은 matplotlib.cm에서 사용되지만 matplotlib.colors.LinearSegmentedColormap을 사용하여 더욱 향상된 색상 맵을 만들 수 있습니다. 일반적으로이 색상 표에서 색상 값은 데이터 값에 따라 선형으로 변합니다.

힌트 : 내 질문은 대수적으로 배열을 플롯하는 방법 하지입니다. 대개 선형 색상 표와 몇 가지 트릭을 유지하여 (log(array)을 플롯하고 10^x으로 색상 표의 x 레이블을 바꾸거나 명시 적으로 plot 명령의 정규화 동작을 변경하여). 여기서는 명시 적으로 색상 맵 인스턴스가 필요합니다.

+0

그래서 'imshow (data, norm = matplotlib.colors.LogNorm())'이 당신이 찾고있는 것이 아닙니까? 그것은 본질적으로 당신이 당신의 힌트에서 묘사하고있는 것을합니다. 대수적으로 배열을 플로팅하고 싶지만 컬러 바가 선형으로 그려지기를 원합니까? – burnpanck

+0

@burnpanck 아니, 그게 내가하지 * 원하는 *, 나는 logarithmic 작동 autonomous colormap 인스턴스가 필요합니다. 그 이유는 matplotlib 색상 맵을 사용하여 플롯을 생성하는 다른 소프트웨어를 사용하기 때문입니다. – flonk

+0

좋아, 어떤 종류의 소프트웨어, 어떤 방법으로 색상 표를 전달합니까? 그 이유는 선형 대 로그 변환을 적용하여 다른 색상 맵을 단지 래핑하는 사용자 정의'Colormap' 서브 클래스를 쉽게 작성할 수 있기 때문입니다. 그러나 이러한 사용자 지정 클래스를 전달할 수 있는지 여부는 분명하지 않습니다. – burnpanck

답변

2

실제 정규 분포표에 전달하기 전에 원하는 정규화를 적용하는 위조를 Colormap 제공 할 수 있습니다. 여기에 같은 색상 맵 구현 :

import matplotlib as mpl 

class ReNormColormapAdaptor(mpl.colors.Colormap): 
    """ Colormap adaptor that uses another Normalize instance 
    for the colormap than applied to the mappable. """ 
    def __init__(self,base,cmap_norm,orig_norm=None): 
     if orig_norm is None: 
      if isinstance(base,mpl.cm.ScalarMappable): 
       orig_norm = base.norm 
       base = base.cmap 
      else: 
       orig_norm = mpl.colors.Normalize(0,1) 
     self._base = base 
     if (
      isinstance(cmap_norm,type(mpl.colors.Normalize)) 
      and issubclass(cmap_norm,mpl.colors.Normalize) 
     ): 
      # a class was provided instead of an instance. create an instance 
      # with the same limits. 
      cmap_norm = cmap_norm(orig_norm.vmin,orig_norm.vmax) 
     self._cmap_norm = cmap_norm 
     self._orig_norm = orig_norm 

    def __call__(self, X, **kwargs): 
     """ Re-normalise the values before applying the colormap. """ 
     return self._base(self._cmap_norm(self._orig_norm.inverse(X)),**kwargs) 

    def __getattr__(self,attr): 
     """ Any other attribute, we simply dispatch to the underlying cmap. """ 
     return getattr(self._base,attr) 

이미 [0,1 정규화됩니다됩니다 값 때문에),이 (orig_norm로 주어진) 이전의 정상화를 취소 할 수 있음을 알 필요가있다. 당신이 unnormalised 값으로 색상 맵을 적용 할 경우 비워 둡니다 :

cmap = ReNormColormapAdaptor(mpl.cm.jet,mpl.colors.LogNorm(vmin,vmax)) 

이미 ScalarMappable가있는 경우에, 당신은에서 색상 맵, 대신에 전달할 수있는 칼라 맵, 이전의 정상화와 모두 새로운 정규화 제한이 적용됩니다 :

import matplotlib.pyplot as plt 

scalar_mappable = plt.imshow(C); 
scalar_mappable.set_cmap(ReNormColormapAdaptor(
    scalar_mappable, 
    mpl.colors.LogNorm 
)) 
관련 문제