2015-01-19 2 views
0

좋아, 나는 하스켈 Chart 라이브러리에 난처한 상황에 직면 해있다. 는 x에 대해 자동으로 선택 범위로,이 확실히 합리적인 로그 로그 라인 차트를 렌더링 않습니다하스켈 차트 라이브러리 : x 축과 y 축이 동일한 로그 - 로그 선 차트

import Data.Vector (Vector, (!)) 
import qualified Data.Vector as V 
import Graphics.Rendering.Chart.Easy hiding (Vector) 

logLogChart name points = toRenderable $ execEC $ plot chart 
    where chart = line name [V.toList $ V.imap makePoint points] 
      makePoint x y = (LogValue (fromIntegral (x+1)), LogValue y) 

을 : 나는 크로노스 하스켈에서 값의 Vector의 로그 - 로그 라인 차트를 만들기 위해이 방법을 알아 냈어요 및 y 축을 표시합니다. (크로노스 하스켈에서 렌더링으로) 한 예 :

  1. 두 축의 범위는 할 필요가 :

    Example log-log chart

    문제는 내가이 두 가지를 필요로하는 곳에 내가 전문 응용 프로그램을 가지고있다 똑같다. (내 x 축은 Vector에 1부터 시작하는 인덱스이기 때문에 x 축의 y 축 범위로 단순화 할 수 있습니다.

  2. 렌더링 된 차트의 크기는 정사각형이어야합니다 위의 예와 같이 사각형이 아닙니다.

라이브러리에 대한 설명서를 살펴 보았지만 완전히 엉망이되었습니다. 어떤 포인터?

+0

해결 방법을 찾으셨습니까? – idontgetoutmuch

+0

@idontgetoutmuch : 아니오, 아직 멀지 않았습니다. –

답변

1

이것은 수행 할 수 있지만 크게 개선 될 수 있습니다 (적어도 unsafePerformIO를 제거하여).

{-# OPTIONS_GHC -Wall      #-} 
{-# OPTIONS_GHC -fno-warn-name-shadowing #-} 
{-# OPTIONS_GHC -fno-warn-type-defaults #-} 
{-# OPTIONS_GHC -fno-warn-unused-do-bind #-} 
{-# OPTIONS_GHC -fno-warn-missing-methods #-} 
{-# OPTIONS_GHC -fno-warn-orphans   #-} 

import Graphics.Rendering.Chart hiding (translate) 
import Graphics.Rendering.Chart.Backend.Diagrams 
import Diagrams.Backend.Cairo.CmdLine 
import Diagrams.Prelude hiding (render, Renderable) 
import Data.Default.Class 
import Diagrams.Backend.CmdLine 

import System.IO.Unsafe 


pointVals :: [(Double, Double)] 
pointVals = map (\(x,y) -> (log x, log y)) [(1,10), (10, 100), (100, 1000)] 

dataPts :: PlotPoints Double Double 
dataPts = plot_points_style .~ filledCircles 2 (opaque red) 
      $ plot_points_values .~ pointVals 
      $ plot_points_title .~ "Data points" 
      $ def 

layout :: Layout Double Double 
layout = layout_title .~ "Log vs Log" 
     $ layout_y_axis . laxis_generate .~ scaledAxis def (0,10) 
     $ layout_x_axis . laxis_generate .~ scaledAxis def (0,10) 
     $ layout_plots .~ [toPlot dataPts] 
     $ def 

myChart :: Renderable() 
myChart = toRenderable layout 

denv :: DEnv 
denv = unsafePerformIO $ defaultEnv vectorAlignmentFns 500 500 

displayHeader :: FilePath -> Diagram B R2 -> IO() 
displayHeader fn = 
    mainRender (DiagramOpts (Just 900) (Just 700) fn 
      , DiagramLoopOpts False Nothing 0 
      ) 

myDiagram :: Diagram Cairo R2 
myDiagram = fst $ runBackend denv (render myChart (500, 500)) 

main :: IO() 
main = displayHeader "LogChart.png" myDiagram 
관련 문제