如何在哈斯克尔图表库中设置轴的范围



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

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

感谢您的任何帮助!

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

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

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

这是一个应用于您的布局的功能。在其中,layout_y_axislaxis_generate是镜头。镜头是参考;在本例中,指对数据类型中字段的引用。在简单的用例中,镜头看起来很多字段标签,除了与唱片公司不同,它们是一流的,可以用它们做很多有趣的事情。事实上,镜头是可以与(.)组成的功能;然而,构图是从左到右完成的,与通常的Haskell练习相反。因此在:

layout_y_axis . laxis_generate

layout_y_axis是对布局中字段的引用,laxis_generate是对轴中字段的引用(根据文档,"生成轴数据的函数");组成它们(按相反/OO 顺序)引用布局 Y 轴的生成函数。

除了镜头本身之外,您的片段的另一个关键部分是 (.~) ,众多镜头操作员之一。它产生二传手函数;也就是说,它接受一个引用和一个值,并生成一个设置引用目标的函数。在您的情况下,您将获得一个函数,该函数使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
    }

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


注意:在 Chart-1.9 的"简单"模块中,使用 .= 而不是 .~

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.

最新更新