2016-09-08 4 views
1

파이썬 Bokeh 라이브러리의 데이터 프레임 df에서 막 대형 차트를 만들려고합니다.파이썬 Bokeh - 블렌딩

value datetime 
5 01-01-2015 
7 02-01-2015 
6 03-01-2015 
... ... (for 3 years) 

내가 한달에 3 개의 바 표시하는 막대 차트 싶은 : 내가 가지고있는 데이터는 단순히처럼 보이는 달 '가치'의 평균에 대한

  • 한 바
  • 달에 대한 '가치'의 MAX에 대한
  • 한 바

내가 만들 수 있어요 월의 '가치'의 의미에 대해 하나 개의 막대 MEAN/MAX/MIN 중 하나의 막 대형 차트 :

동일한 플롯에 3 막대 (평균, 최대, 최소)를 어떻게 나타낼 수 있습니까? 그리고 가능하다면 서로 위에 겹쳐서.

마치 blend (이 예제 에서처럼 : http://bokeh.pydata.org/en/latest/docs/gallery/stacked_bar_chart.html)처럼 보이지만 작동 원리에 대한 자세한 설명을 찾을 수 없습니다. bokeh 웹 사이트는 훌륭하지만이 특정 항목에 대해서는 실제로 자세히 설명되어 있지 않습니다.

누구나 나를 도와 줄 수 있습니까?

답변

2

그 블렌드 예가 나를 올바른 길로 인도했습니다.

import pandas as pd 
from pandas import Series 
from dateutil.parser import parse 
from bokeh.plotting import figure 
from bokeh.layouts import row 
from bokeh.charts import Bar, output_file, show 
from bokeh.charts.attributes import cat, color 
from bokeh.charts.operations import blend 

output_file("datestats.html") 

그냥 몇 가지 샘플 데이터, 당신이 맞는 볼을 변경할 주시기 바랍니다. 먼저 데이터를 적절한 형식으로 바꾸어야했습니다. 그것은 당신의 날짜 형식처럼 보였다

# Sample data 
vals = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] 
dates = ["01-01-2015", "02-01-2015", "03-01-2015", "04-01-2015", 
     "01-02-2015", "02-02-2015", "03-02-2015", "04-02-2015", 
     "01-03-2015", "02-03-2015", "03-03-2015", "04-03-2015" 
     ] 

"일 - 월 - 년"이었다 - 팬더가 제대로 인식 할 수 있도록 나는 dateutil.parser을 사용했다.

# Format data as pandas datetime objects with day-first custom 
days = [] 
days.append(parse(x, dayfirst=True) for x in dates) 

당신은 또한 월별로 그룹화 필요 - 내가 판다는, 날짜를 다운 샘플링하는 리샘플링 매달 적절한 값을 얻을하고 dataframe에 병합 사용.

# Put data into dataframe broken into min, mean, and max values each for month 
ts = Series(vals, index=days[0]) 
firstmerge = pd.merge(ts.resample('M').min().to_frame(name="min"), 
         ts.resample('M').mean().to_frame(name="mean"), 
         left_index=True, right_index=True) 
frame = pd.merge(firstmerge, ts.resample('M').max().to_frame(name="max"), 
       left_index=True, right_index=True) 

는 보케는 차트의 X 값, discussed here 등으로 팬더 dataframe의 인덱스를 사용할 수 있지만 날짜 레이블에 대한 새 열을 추가, 그래서 그것은 날짜 값을 좋아하지 않았다. 아래의 timeseries 코멘트를보십시오 ***.

# You can use DataFrame index for bokeh x values but it doesn't like timestamp 
frame['Month'] = frame.index.strftime('%m-%Y') 

마지막으로 우리는 차트 작성 부분으로갑니다. 올림픽 메달 표본과 마찬가지로 Bar에게 몇 가지 인수를 전달합니다. 그러나 이것들을 가지고 놀아라. 그러나 참고 내가 차트의 바깥에 그것을 만들어서 범례를 추가했다. 데이터 포인트가 많으면 여기에 내장 된 방법과 같이 차트에서 지저분 해집니다.

Bokeh_output

이 코드를 복사/붙여 넣기하면

# Main object to render with stacking 
bar = Bar(frame, 
      values=blend('min', 'mean', 'max', 
         name='values', labels_name='stats'), 
      label=cat(columns='Month', sort=False), 
      stack=cat(columns='values', sort=False), 
      color=color(columns='values', 
         palette=['SaddleBrown', 'Silver', 'Goldenrod'], 
         sort=True), 
      legend=None, 
      title="Statistical Values Grouped by Month", 
      tooltips=[('Value', '@values')] 
     ) 

# Legend info (displayed as separate chart using bokeh.layouts' row) 
factors = ["min", "mean", "max"] 
x = [0] * len(factors) 
y = factors 
pal = ['SaddleBrown', 'Silver', 'Goldenrod'] 
p = figure(width=100, toolbar_location=None, y_range=factors) 
p.rect(x, y, color=pal, width=10, height=1) 
p.xaxis.major_label_text_color = None 
p.xaxis.major_tick_line_color = None 
p.xaxis.minor_tick_line_color = None 

# Display chart 
show(row(bar, p)) 

, 이것은 당신이 표시됩니다 것입니다.
당신은 스스로를 렌더링 또는 당신이 그것을 제공하는 경우 경우 : 툴팁 (값)를 참조하기 위해 각 블록 위에 마우스를 올려.

은 내가 (색상이 마음에 와서) 수 추상적 모든 것을하지 않았다.

당신이 구축하고 싶었 차트 유형이지만, 스택 합계 (분 +이 + 최대를 의미) 때문에 다른 차트 스타일은 의미있는 정보를 제공하지 않습니다 더 informatively 데이터를 표시하는 것처럼 보인다. 그러나 나는 당신의 데이터가 실제로 무엇인지 모른다.

는 *** 당신은 timeseries chart을 고려할 수 있습니다. 이렇게하면 플로팅하기 전에 수행 된 논쟁의 일부가 제거 될 수 있습니다.

또한 그들을 적재 대신 grouping your bars을 고려할 수 있습니다. 그렇게하면 매월 숫자를 쉽게 시각화 할 수 있습니다.