gpt4 book ai didi

haskell - Haskell图表库中如何设置轴的范围

转载 作者:行者123 更新时间:2023-12-03 22:12:18 25 4
gpt4 key购买 nike

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

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

谢谢你的帮助!

最佳答案

I would definitely appreciate information on better ways of doing this or more information on how this works with lenses (I still don't really understand what this is doing).



我会试一试的。这将是一个粗略的解释,不仅是为了让事情简单,而且因为我仍然在掌握镜头的窍门。在开始之前,请注意您链接到 Chart 0.14 的文档,该版本早于 API 到镜头的转换。这里是 the current docs你应该引用。现在,到您的代码段:
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 轴生成函数的引用。

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

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

然而,这太丑陋了。 lens 可以做的不仅仅是改进讨厌的语法;无论如何,对于像 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.

关于haskell - Haskell图表库中如何设置轴的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22795664/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com