7

在 haskell-chart 中,如何更改轴的范围?似乎它与镜头和视口有关,但作为 Haskell 的初学者,我很难阅读 API:

http://hackage.haskell.org/package/Chart-0.14/docs/Graphics-Rendering-Chart-Axis-Types.html

谢谢你的帮助!

4

1 回答 1

6

我肯定会很感激有关执行此操作的更好方法的信息或有关如何使用镜头的更多信息(我仍然不明白这是在做什么)。

我会试一试的。这将是一个粗略的解释,不仅是为了让事情简单,而且因为我仍然在掌握镜头的窍门。在开始之前,请注意您链接到 Chart 0.14 的文档,该版本早于 API 到lens的转换。以下是您应该参考的当前文档。现在,到您的代码段:

layout_y_axis . laxis_generate .~ scaledAxis def (0,1)

这是一个应用于您的布局的功能。在它里面,layout_y_axislaxis_generate镜头。镜头是参考;在这种情况下,引用数据类型中的字段。在简单的用例中,镜头看起来很像现场标签,但与唱片公司不同的是,它们是一流的,可以用它们做很多有趣的事情。实际上,lens 是可以用(.);组成的函数。然而,组合是从左到右完成的,与通常的 Haskell 练习相反。因此在:

layout_y_axis . laxis_generate

layout_y_axis是对布局中字段laxis_generate的引用,是对轴中字段的引用(根据文档,“生成轴数据的函数”);组合它们(以相反/OO 顺序)提供了对布局 Y 轴生成函数的参考。

除了镜头本身,您的片段的另一个关键部分是(.~)众多镜头操作员之一。它产生setter函数;也就是说,它接受一个引用和一个值,并生成一个设置引用目标的函数。在您的情况下,您将获得一个函数,该函数使scaledAxis def (0,1)布局的 Y 轴生成函数。

现在,如果您查看Graphics.Rendering.Chart.Layout的文档,您会发现不仅是镜头,还有_layout_y_axis和,它们分别是和_laxis_generate的字段。它们是镜头的背景;事实上,镜头可以并且在这种情况下是自动从它们生成的。鉴于模块导出字段标签,您可以在没有镜头的情况下编写函数,只使用记录语法:LayoutLayoutAxis

\lay -> lay
    { _layout_y_axis =
        (\yax -> yax { _laxis_generate = scaledAxis def (0,1) })
        $ _layout_y_axis lay
    }

然而,这太丑陋了。lens可以做的不仅仅是改进讨厌的语法;无论如何,对于像这样的库Chart,字段操作在整个 API 中完成,只需用简洁且可组合的东西替换通常的嵌套记录语法已经是一件非常好的事情。


注意:在 Chart-1.9 的“Easy”模块中,使用.=代替.~

import qualified Graphics.Rendering.Chart.Backend.Cairo as C
import qualified Graphics.Rendering.Chart.Easy          as C

plotit outfile points =
  C.toFile C.def outfile $ do
    C.layout_y_axis . C.laxis_generate C..= C.scaledAxis C.def (0, 1)
    C.plot (C.points "n_coffees" points) -- etc.
于 2014-04-02T04:03:27.710 回答