使用Haskell Charts制作可读性强的数字图表

3
我正在尝试使用Haskell-Charts(http://hackage.haskell.org/package/Chart)生成一些图表。它运行良好,我得到了一个漂亮的图表,但唯一的“问题”就是左边的数字有点难以阅读。也许有一种方法可以在显示之前提供一个转换这些数字的函数吗?虽然我可以在制图之前将数字转换,但会失去精度。我一直在看文档,但如果存在相应的函数,我并没有找到。谢谢。
以下是代码:
import Graphics.Rendering.Chart.Easy
import Graphics.Rendering.Chart.Axis.LocalTime
import Graphics.Rendering.Chart.Backend.Diagrams
import Data.Time.LocalTime

main = do
  -- Get datas
  toFile def "test.svg" $ do
    layout_title .= "Active mem"
    plot (line "Active" $ [L.map (\v -> ((utcToLocalTime utc $ time v) :: LocalTime, (fromIntegral $ value v) :: Int)) $ V.toList q])

很不幸,我从数据库中获取数据,无法公开访问。但是一个包含大量数字的[(LocalTime, Int)]列表应该可以给你类似的结果。顺便说一下,我正在使用Diagrams后端。


你能提供你的代码让我们调试一下吗? - Cirquit
我已经添加了我能添加的内容,但数据还没有。你可以尝试使用类似于 [[(某些本地时间,“2000000000”),(某些本地时间+10秒,“2000005000”)]] 的方式来获得类似的结果。 - Ulrar
我相信这是可以做到的。但是 - 不是不推荐 - 我一直觉得 chart简单绘制一些东西而不涉及那些格式不良的数字等问题 方面有点笨拙。我想宣传 dynamic-plot,它可以自动完成这种事情。(但在标签等方面远远不如 chart 丰富。) - leftaroundabout
我不知道它的存在,但据我所知,那是一种图形窗口类型的东西,对吧?我的目标是创建一个API,以便从数据库动态地捕捉图形数据。我喜欢图表的toFile函数,因为它使这个过程变得非常容易,只要我能够弄清楚如何调整图形就好了。但我会阅读关于动态的资料,截图看起来相当不错。 - Ulrar
好的,由于dynamic-plot实际上是通过diagrams渲染所有内容的,因此从原理上讲,将其输出到文件而不是GTK窗口应该很容易。事实上我一直想实现这个功能,但一直拖延...下一个版本一定要加入它。 - leftaroundabout
将其输出到文件、字符串或其他地方都可以,但是如果有一个跳过GTK依赖的选项,那么在无头服务器上运行就会非常好。 - Ulrar
1个回答

5
深入研究图表源代码后,我找到了解决方案。
下面是可行的代码。你可以将func更改为任何你喜欢的东西。
这将显示y轴标签10,20,30,40,实际数据为100,200,300,400
import Graphics.Rendering.Chart.Easy
import Graphics.Rendering.Chart.Backend.Diagrams

func :: Int -> String
func x = show $ x `quot` 10

vals :: [(Int,Int)]
vals = [(1,100),(2,200),(3,300),(4,400)]
main = do
  toFile def "test.svg" $ do
    layout_title .= "test"
    layout_y_axis . laxis_generate .= autoScaledIntAxis(LinearAxisParams{
        _la_labelf = map func,
        _la_nLabels = 5,
        _la_nTicks = 10
        })
    plot $ points "Score" vals

很不错,谢谢!我选择了这个函数:(\y -> TL.unpack $ FO.format (FO.prec 3 FO.% " GB") $ (fromIntegral y) / 1073741824.0)。它给出了一些相当不错的结果,根据结果可能需要调整精度,但没关系。 - Ulrar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接