在haskell图表中,如何更改轴的范围?它似乎与镜头和视口有关,但作为Haskell的初学者,我很难阅读API:
http://hackage.haskell.org/package/Chart-0.14/docs/Graphics-Rendering-Chart-Axis-Types.html
感谢您的帮助!
答案 0 :(得分:6)
我绝对会欣赏有关更好的方法的信息,或者有关镜头如何使用的更多信息(我仍然不明白这是做什么的。)
我会去看看。这将是一个粗略的解释,不仅仅是为了保持简单,而且因为我仍然得到了镜头的悬念。在开始之前,请注意您链接到图表0.14的文档,这是一个早于将API转换为镜头的版本。以下是您应该参考的the current docs。现在,到您的代码段:
layout_y_axis . laxis_generate .~ scaledAxis def (0,1)
这是一个应用于您的布局的功能。在其中,layout_y_axis
和laxis_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
和{{ 1}}分别。它们是镜片的支撑领域;实际上,镜片可以是,并且在这种情况下,是从它们自动生成的。鉴于模块导出了字段标签,您可以使用记录语法编写不带镜头的函数:
LayoutAxis
然而,这太难看了。 镜头可以做很多事情,而不是改善令人讨厌的语法;在任何情况下,对于像\lay -> lay
{ _layout_y_axis =
(\yax -> yax { _laxis_generate = scaledAxis def (0,1) })
$ _layout_y_axis lay
}
这样的库,其中在整个API中进行字段操作,只需用一些整洁和可组合的东西替换通常的嵌套记录语法就是一件非常好的事情。
注意:在Chart-1.9的“简易”模块中,使用Chart
代替.=
:
.~