본문 바로가기
Data Analysis/Spotfire

[TIBCO Spotfire] Barchart 응용

by 불탄오징어 2019. 4. 22.
반응형

2-3. Bar Chart 고급응용


저번 글에서 Barchart의 일반적인 기능을 활용하여 구성해보는 예제를 진행했습니다. 이번 글에서는 저번 글의 데이터를 활용해서 Animaiton처럼 자동으로 년도를 변경하는 예제를 만들어보려고 합니다. 본 예제를 진행하게 된 이유는 아래의 글을 봤기 때문인데요.

 

[데이터의 아름다움: 역사상 최고로 꼽히는 10가지 데이터 시각화의 예] : 

https://www.tableau.com/ko-kr/learn/articles/best-beautiful-data-visualization-examples

 

Next America라는 이름으로 소개된 차트인데 향후 미국의 인구 분포 및 베이비붐 세대의 변화가 어떻게 되는지를 보여주고 있습니다. 저번에 만든 Barchart와 동일하며 동일한 구조의 데이터 이기 때문에 시도를 해볼려고 합니다.

 

 

위의 Barchart는 사용자가 년도를 수동으로 변경해줘야 합니다. 이걸 자동으로 수행하도록 해보겠습니다.
먼저 데이터 구조를 바꿔야 하는데 기존 데이터를 오른쪽과 같이 변경해야합니다.

 

 

이를 위해서 상단 메뉴에서 File - Add Data Tables를 실행합니다.

 

 

  • Add를 눌러서 기존에 삽입한 데이터를 선택
  • 아래 Transformations에서 Unpivot을 선택
  • Add 클릭
  • Columns to pass through 에 '성별', '연령별'
  • Columns to transform에 나머지 변수를 삽입
  • OK를 눌러주고
  • Ok를 눌르면 변환 실행

 

이후 Category로 변환된 칼럼의 칼럼명을 'Year'로 수정합니다.
그 다음에는 차트를 자동으로 변환해줄 기능을 추가해보겠습니다.

Text Area에서 Edit 모드를 연 후 Insert Action Control을 실행합니다.

 

 

Display text에 버튼명을 쓰고 좌측 Script로 변환 후 New를 눌러 New Script 창을 실행합니다.
그 후 Script name을 쓰고 Script 에 아래의 코드를 삽입합니다.
(참조 : https://spotfired.blogspot.com/2016/01/animating-visualizations.html)

 

 

   from Spotfire.Dxp.Application.Filters import RangeFilter, ValueRange
   from Spotfire.Dxp.Data import IndexSet

   #get a reference to the range filter in question
   filt=Document.FilteringSchemes[0].Item[myDataTable].Item[myDataTable.Columns.Item["Year"]].As[RangeFilter]()

   delta = 1
   if(filt.ValueRange.High.ToString() == "High"): #reset filters
    idx = IndexSet(myDataTable.RowCount,True)
    min = myDataTable.Columns["Year"].RowValues.GetMinValue(idx).Value
    filt.ValueRange = ValueRange(min,min+delta) 
   else:
     filt.StepBodyUp()

   print filt.ValueRange

 

 

그리고 하단에 Data Table에 대한 변수 지정 기준을 추가한 후 Data Table (2)와 연결합니다. Data Table (2)는 기존 테이블을 UnPivot한 테이블입니다.

그 후 모두 OK를 눌러 창을 닫습니다. 위의 코드는 실행될 때마다 Year 칼럼의 값을 한단계씩 증가 시키고 제일 마지막 값이 될 때 처음으로 다시 돌려 놓습니다. 즉 누를때마다 Year이 변경되며 마지막 값이 되면 알아서 처음으로 돌아가는거죠.

다음은 이 Python 코드를 자동으로 실행할 기능을 넣습니다. 다시 Text Area를 Edit Html 모드로 실행합니다.

 

 

 

 

그러면 위와 같은 코드가 있을건데 아래와 같이 변경합니다.(참고로 id는 달라질 수 있습니다. 유의!)

 

 

 

 

   var pid
   var speed = .5 //change filter 2/second
   start = function(){
     pid = setInterval(function(){
       $("#spotfireButton input").click()
     },speed*1000)
     $('#stopButton').show()
     $('#startButton').hide()
   }

   stop = function(){
    clearInterval(pid)
       $('#dd').text("stopped " + pid)
    $('#stopButton').hide()
    $('#startButton').show()
   }

   $("#stopButton").button().on('click',stop)

   $("#startButton").button().on('click',start)

 

다음 모두 OK를 눌러 적용을 해주면 아래와 같이 버튼이 바뀝니다.

 

 

그리고 이버튼을 클릭하면

 

 

참 쉽죠? 

2-3.barchart.dxp
0.71MB
2-3.barchart.xlsx
0.05MB

 

P.S 기존 Spotfire파일을 못찾고 데이터만 찾아서 Spotfire 파일 재생성후 올립니다. 약간 다른부분은 양해부탁드립니다.

댓글