F#奇妙游(9):来一点点画图

news2024/9/21 14:45:22

F#绘图

如果Python没有Matplotlib,R没有ggplot,Matplab没有plot函数……就像阿珍爱上了阿强,能画图的脚本才是好脚本。当然,F#有画图包,但是F#在数据处理中的地位就像下面,这也是我们没办法的。
在这里插入图片描述

ScottPlot是一个基于.NET的绘图包,支持C#和F#,支持Windows、Linux和MacOS。选择ScottPlot是因为在nuget上搜索Plot,这个包排到第一,下载数也是排在第一。目前ScottPlot版本是4.1.64,V5正在开发中,还在beta阶段。那就用V4吧。

首先是脚本环境,最简单,在终端里运行dotnet fsi,就可以进入F#的REPL环境。也可以把下面的代码存成一个文件scatter.fsx,然后运行dotnet fsi scatter.fsx

#r "nuget: ScottPlot, 4.1.64"

open ScottPlot
let x = [|1.0..5.0|]
let y = [|for x in x -> x * x|]

let plt = Plot(400, 300)

plt.AddScatter(x, y)
plt.Title("scatter sample")
plt.SaveFig("scatter.png",scale=2.0)

运行结果就可以得到这个图片文件。
在这里插入图片描述

ScottPlot的其他功能

ScottPlot的V4的API帮助写得听清楚的。

大部分的时候,只需要创建一个Plot对象,调用Plot对象的方法来绘图,最后调用SaveFig方法保存图片就可以了。如果是在WinForm或者WPf中,还可以调用Render方法把图片渲染到窗口中。

这个Plot对象,可以反复使用,通过调用Clear方法,可以清空画布,然后重新绘制。这样子,就可以实现动态绘图。

//......
plt.Clear()
plt.AddScatter(x, y)
plt.Title("scatter sample")
plt.SaveFig("scatter.png",scale=2.0)

绘制多个图形

let x = [|1.0..5.0|]
let y = [|for x in x -> x * x|]

let y2 = [|for x in x -> x * x * x|]

let plt = Plot(400, 300)

let s1 = plt.AddScatter(x, y, label="squar")
let s2 = plt.AddScatter(x, y2)
s2.Label <- "cube"

plt.Title("scatter sample")
plt.Legend(true, Alignment.UpperLeft)

多次调用AddXXX就可以把多个图形画在同一个画布上,然后调用Legend方法,就可以显示图例。

图形对象

除了上面调用plt.AddScatter 方法,还可以直接创建图形对象,然后调用Plot对象的Add方法,把图形对象添加到画布上。

plt.Clear()

open System.Drawing

let xs = DataGen.Consecutive(51)
let sin = DataGen.Sin(51)

// instantiate a plottable
let splt = Plottable.ScatterPlot(xs, sin)

// customize its style or change its data as desired
splt.Color <- Color.Navy
splt.MarkerSize <- float32 10.0
splt.MarkerShape <- MarkerShape.filledDiamond
splt.Label <- "Navy"

// add it to the plot
plt.Add(splt)
plt.Legend(false)
plt.Title("Navy")

在这里插入图片描述

基本上,所有的图形对象都有Color、Label、MarkerSize、MarkerShape等属性,可以通过这些属性来定制图形的样式。

Jypyter Notebook

除了在脚本里面使用,在Jupyter Notebook中使用ScottPlot也是可以的。

#r "nuget: ScottPlot, 4.1.64"
open ScottPlot

// 把Plot对象转换为HTML,并注册到Jupyter的Formatter中
open Microsoft.DotNet.Interactive.Formatting
let plt2html (p:Plot) = p.GetImageHTML()
Formatter.Register<Plot>(plt2html, HtmlFormatter.MimeType)

后面这三行代码目前已经耗尽我的全部F#力,实现在Jupyter中插入ScottPlot的Plot对象。我在网上找了很久都没有找到,最后自己根据函数签名写出来的。

据说用Plotly.NET可以更加简单,这个包实现了Plotly.NET.Interactive,我目前还没有尝试,因为看着Plotly.NET的文档感觉没有ScottPlot来得清爽。

结果

就这样子,结果就比较美好。

在这里插入图片描述

总结

  1. .Net画图的包不缺
  2. 目前感觉画的图专业性略有差距
  3. F#调用、Jupyter都很丝滑

参考资料

ScottPlot@nuget

ScottPlot@github

ScottPlot Homepage

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/729433.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分析openGauss包内集合类型的实现方法

前言 Oracle中集合类型覆盖了Postgresql数组的功能&#xff0c;在Oracle用户中时非常常用的。 尤其是包内定义的集合类型&#xff0c;在SPEC定义后即可直接使用&#xff0c;scope也只在包在生效&#xff0c;使用非常灵活。 开源PG因为有数组没有实现这部分语法&#xff0c;下…

超级广场效果的耳机放大器音响电路设计

用头戴式耳机&#xff0c;尤其是小型耳机听音乐&#xff0c;总感到音乐味不够足&#xff0c;在低频段的效果更差。因此用本机增强耳机的低频特性&#xff0c;并采用立体声反相合成的办法&#xff0c;加上内藏简易矩阵环绕声电路&#xff0c;能获得强劲的低音和在较宽的范围内展…

Windows mingw64 最简易 安装配置

其实挺简单一件事 很多教程都搞复杂了 自己写一个 只需要两步 1. 下载压缩包并解压 2. 配置环境变量 (1). GitHub 下载地址 Releases niXman/mingw-builds-binaries GitHub 如果GitHub下载太慢可以来这里加速 或者用地址2 GitHub Proxy 代理加速 (ghproxy.com) (2). 下…

-Xss1m / -XX:ThreadStackSize=512k

-Xss / -XX:ThreadStackSize指定线程最大栈空间jdk1.4里默认的栈大小是256KBjdk1.5里默认的栈大小为1M配置JVM启动参数&#xff1a;-Xmx20m -Xms20m -Xss1m -XX:PrintCommandLineFlags-XX:ConcGCThreads3 -XX:G1ConcRefinementThreads13 -XX:GCDrainStackTargetSize64 -XX:Init…

学习grpc

Grpc简介&#xff1a; gRPC是一个高性能、通用的开源RPC框架&#xff0c;其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计&#xff0c;基于ProtoBuf(Protocol Buffers)序列化协议开发&#xff0c;且支持众多开发语言&#xff0c;能够基于语言自动生成客户端和服务端…

软负载Nginx详细配置及使用案例

Nginx使用与配置 什么是nginx Nginx 是一个高性能的HTTP和反向代理服务&#xff0c;也是一个IMAP/POP3/SMTP服务。 处理响应请求很快高并发连接低的内存消耗具有很高的可靠性高扩展性热部署 master 管理进程与 worker 工作进程的分离设计&#xff0c;使得 Nginx 具有热部署的…

Quartz表达式在线生成器

Quartz Cron表达式生成器 - devTest.run Quartz是一款高效的定时任务调度框架&#xff0c;由于其稳定性&#xff0c;高可用性和灵活性&#xff0c;Quartz已成为Java企业级开发中应用最为广泛的定时任务调度框架之一。 Quartz的主要特点包括&#xff1a;可配置的作业触发器&…

学C的第二十五天【指针的进阶】

相关代码gitee自取&#xff1a;C语言学习日记: 加油努力 (gitee.com) 接上期&#xff1a; 学C的第二十四天【练习&#xff1a;1. 打印菱形&#xff1b;2. 打印自幂数&#xff1b;3. 求Snaaa..n项之和&#xff1b;4. 喝汽水问题&#xff1b;5. 调整数组使奇数位于偶数前面&…

第三章——处理数据

面向对象编程&#xff08;OOP&#xff09;的本质是设计并扩展自己的数据类型。设计自己的数据类型就是让类型与数据匹配。在创建自己的类型之前必须先了解C内置的类型。 内置的C类型分为两组&#xff1a;基本类型和复合类型 简单变量 程序通常都需要存储信息&#xff0c;为把…

git commit history导出

git log --after"2022-1-1" --dateshort --prettyformat:"%H","%an","%ae","%ad","%s" --shortstat --no-merges再简洁一点 git log --after"2022-4-1" --dateshort --prettyformat:%H,%an,%ae,%ad,%…

Network Neuroscience:整个生命周期的功能连接体指纹

导读 随着年龄的增长&#xff0c;人脑功能结构发生了系统性的变化。然而&#xff0c;功能连接(FC)作为一种检测独特“连接体指纹”的强大特征&#xff0c;使个体能够在同龄人中被识别出来。虽然已在年轻人样本中观察到这种指纹&#xff0c;但该方法在整个生命周期内的可靠性尚…

ACL 2023|大模型时代,自然语言领域还有什么学术增长点?

国际计算语言学年会&#xff08;Annual Meeting of the Association for Computational Linguistics&#xff0c;简称 ACL&#xff09;是自然语言处理&#xff08;NLP&#xff09;领域的顶级国际会议&#xff0c;ACL 2023 将于2023年7月9-14日在加拿大多伦多举行。随着人工智能…

电脑高手的选择:为何只需一款杀毒软件?

对于电脑高手来说&#xff0c;保护计算机免受恶意软件和病毒的侵害至关重要。然而&#xff0c;有些人可能认为安装多个杀毒软件能够提供更优质的防护能力。但事实上&#xff0c;电脑高手通常只选择安装一款杀毒软件&#xff0c;这其中包含着一定的原因和考虑。本文将探讨为什么…

Java版本企业电子招投标采购系统源码功能模块功能描述+数字化采购管理 采购招投标

功能模块&#xff1a; 待办消息&#xff0c;招标公告&#xff0c;中标公告&#xff0c;信息发布 描述&#xff1a; 全过程数字化采购管理&#xff0c;打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力&#xff0c;为外部…

基于Python+MySQL所写的医院管理系统

点击以下链接获取源码资源&#xff1a; https://download.csdn.net/download/qq_64505944/87985429?spm1001.2014.3001.5503 目录 摘要 I 1 需求分析 1 1.1 任务描述 1 1.2 需求分析的过程 1 1.3 业务需求 2 1.4 功能描述 2 2 总体设计 3 2.1 系统开发环境 3 2.2 系统功能流…

【云原生】Pod 的生命周期

Pod 的生命周期 本文讲解的是 Kubernetes 中 Pod 的生命周期&#xff0c;包括生命周期的不同阶段、存活和就绪探针、重启策略等。 Pod phase Pod 的 status 字段是一个 PodStatus 对象&#xff0c;PodStatus中有一个 phase 字段。 Pod 的相位&#xff08;phase&#xff09;…

DOM事件机制(事件流、事件委托、事件类型)以及BOM

HTML DOM 允许 JavaScript 对 HTML 事件作出反应。JavaScript 能够在事件发生时执行&#xff0c;比如当用户点击某个 HTML 元素时。 JavaScript与HTML之间的交互是通过事件实现的。事件就是文档或浏览器窗口中发生的一些特定的交互瞬间。 虽然 ECMAScript 把浏览器对象模型&…

【面试题28】什么是PHP-FPM?它与PHP和Nginx有什么关系

文章目录 一、前言二、什么是PHP-FPM&#xff1f;三、PHP-FPM的生命周期3.1 启动阶段3.2 初始化阶段3.3 请求处理阶段3.4 关闭阶段 四、PHP-FPM与PHP的关系五、PHP-FPM与Nginx的通信方式六、总结 一、前言 本文已收录于PHP全栈系列专栏&#xff1a;PHP面试专区。 计划将全覆盖P…

【视觉SLAM入门】2.旋转--李群与李代数

"川泽纳污" 0. 一个例子1. 群和李群2. 李代数2.1 推导和性质2.2 s o ( 3 ) \mathscr{so(3)} so(3) 和 s e ( 3 ) \mathscr{se(3)} se(3)2.3 计算李代数的幂 e x p ( ϕ \;exp(\phi exp(ϕ^ ) ) )2.4 李代数乘法2.5 从李代数乘法到导数&#xff1a;2.5.1 直接求导2.…