2017-11-09 8 views
0

일련의 2D 분산 형 플롯 (대 x[2] 등)에서 높은 딤 지점 세트 x (여기 dim (6 x 42))을 시각화하려고합니다. .) bokeh를 사용합니다. [edit2] 참고로 scikit-opt의 this 좋은 예를 참조하십시오. 두 플롯에서 x[1]이 발생하면 동일한 범위와 상호 작용해야하며 플롯은 동시에 재조정해야합니다. 나는이 일을 성취했지만 올바르게 확장되지는 않습니다. 여기서 최소한 예이다 :는 ipython 노트북으로 .. 여러 플롯간에 x_range와 y_range를 섞으면 보케스 축 한계가 실패합니다.

import bokeh 
import bokeh.io 
import numpy as np 
import bokeh.plotting 
bokeh.io.output_notebook() 

# That's my fictional dataset 
x = np.random.randn(6, 42) 
x[2] *= 10 

# Build the pairwise scatter plots 
kw = dict(plot_width=165, plot_height=165) 
# `ranges` stores the range in each dimension, 
# used as both, x- and y-range depending on 
# where the variable is. 
figs, ranges = {}, {} 
for r, row in enumerate(x): 
    for c, col in enumerate(x): 
     if r is not c: 
      fig = bokeh.plotting.figure(
       x_range=ranges.get(c, None), y_range=ranges.get(r, None), 
       **kw) 
      fig.scatter(x=col, y=row) 

      fig.xaxis.axis_label = f'Dim {c}' 
      fig.yaxis.axis_label = f'Dim {r}' 

      if c not in ranges: 
       ranges[c] = fig.x_range 

      if r not in ranges: 
       ranges[r] = fig.y_range 

      figs[f'{r}_{c}'] = fig 
     else: 
      break 

# Setup the plotting layout 
plots = [[]] 
for r, row in enumerate(x): 
    for c, col in enumerate(x): 
     if r is not c: 
      plots[-1].append(figs[f'{r}_{c}']) 
     else: 
      plots.append([]) 
      break 

staircase = bokeh.layouts.gridplot(plots, **kw) 
bokeh.plotting.show(staircase) 

[EDIT2]

(> = py3.6), 나뭇잎이 희미 1의 배율을 설정하고, 정확하게 2. 그런 다음 dim 2와 같이 다음 차원의 눈금을 설정하기 시작합니다.이 점을 확인하기 위해 dim 2를 10 배로 조정했습니다.

대화 형으로 대화 상자를 다시 최적의 설정으로 다시 조정할 수 있습니다. 그러나 기본적으로 그렇게하고 싶습니다. 어떤 옵션을 bokeh 안에 가지고 있습니까? rescale? 나는 fig.xaxis.bounds으로 약간 연주했지만 성공하지 못했습니다. 당신의 도움을 주셔서 감사합니다!

에필로그 :

for i, X in enumerate(x): 
    ranges[i].start = X.min() 
    ranges[i].end = X.max() 

가 시작 범위를 해결하기 위해 : @의 bigreddot의 대답에 따라 , 나는 라인을 추가했다. 나는 아직도 행동이 버그라고 생각한다.

답변

1

코드와 설명에서 나는 아직도 당신이 달성하고자하는 바를 말할 수 없습니다. [1] 그러나 기본값 인 DataRange1d 범위는 플롯의 사용이 모든 렌더가 공유하는 모든 플롯에서 자동으로 공간을 차지한다는 것을 설명합니다. 이러한 의미에서 코드를 실행할 때 기대할 수있는 부분을 정확하게 볼 수 있습니다. 당신이 다른 무언가를 원하는 경우, 두 가지를 제어 할 수있다 :

  • DataRange1d.renderers 속성이 있습니다. "자동"범위가 렌더러의 하위 집합에만 있도록하려면이 속성을 원하는 목록으로 명시 적으로 설정할 수 있습니다. 렌더러는 글리프 함수 (예 : fig.scatter

  • "자동"범위를 사용하지 마십시오. x_rangey_range을 직접 설정하여 Range1d 개체로 설정할 수도 있습니다. 여기에는 사용자가 설정할 수있는 startend 속성이 있으며 범위의 명확한 경계가됩니다. x-range=Range1d(0, 10)

는 [1] 범위는 내가 이상한 방법을 고려할 것입니다 무엇에 연결되어, 그 의도가 있다면 알 수 없습니다. 그러나 이것은 루핑/파이썬 코드의 결과이며 Bokeh의 결과는 아닙니다.

+0

범위는 각 차원이 고유 한 범위를 갖도록 연결됩니다. x [1] 영역을 변경하면 x [1]이 표시된 모든 곳이 바뀝니다. 나는 더 명확하게하기 위해 나의 질문을 편집했다. – Jus

+0

x 범위를 y 범위에 연결한다는 것은 여전히 ​​이상한 것처럼 보입니다. (이는 단지 'int'를 사용하지 않고'ranges' dict에서'r'과'c'를 구별하지 않기 때문에 발생합니다.) 아마도 여러분은 스크린 샷을 찍고 원하는 것을 주석을 달아주세요. 어쨌든 위에 나열된 옵션은 범위를보다 직접적으로 제어하는 ​​데 사용할 수있는 옵션입니다. – bigreddot

+0

scikit-opt의 [this] (https://scikit-optimize.github.io/notebooks/visualizing-results_files/visualizing-results_15_1.png)를 참조하십시오. 꽤 유용하다고 생각합니다. 7D 기능을 어떻게 시각화합니까? – Jus