当前位置: 首页 > news >正文

郑州做网站多少钱哈佛门户网站建设特点

郑州做网站多少钱,哈佛门户网站建设特点,秦皇岛网站建设企业,wordpress 考试系统Go 每日一库之 plot简介本文介绍 Go 语言的一个非常强大、好用的绘图库——plot。plot内置了很多常用的组件#xff0c;基本满足日常需求。同时#xff0c;它也提供了定制化的接口#xff0c;可以实现我们的个性化需求。plot主要用于将数据可视化#xff0c;便于我们观察、…Go 每日一库之 plot简介本文介绍 Go 语言的一个非常强大、好用的绘图库——plot。plot内置了很多常用的组件基本满足日常需求。同时它也提供了定制化的接口可以实现我们的个性化需求。plot主要用于将数据可视化便于我们观察、比较。快速使用先安装$ go get gonum.org/v1/plot/...复制代码后使用package mainimport ( log math/rand gonum.org/v1/plot gonum.org/v1/plot/plotter gonum.org/v1/plot/plotutil gonum.org/v1/plot/vg)func main() { rand.Seed(int64(0)) p, err : plot.New() if err ! nil { log.Fatal(err) } p.Title.Text Get Started p.X.Label.Text X p.Y.Label.Text Y err plotutil.AddLinePoints(p, First, randomPoints(15), Second, randomPoints(15), Third, randomPoints(15)) if err ! nil { log.Fatal(err) } if err p.Save(4*vg.Inch, 4*vg.Inch, points.png); err ! nil { log.Fatal(err) }}func randomPoints(n int) plotter.XYs { points : make(plotter.XYs, n) for i : range points { if i 0 { points[i].X rand.Float64() } else { points[i].X points[i-1].X rand.Float64() } points[i].Y points[i].X 10 * rand.Float64() } return points}复制代码程序运行输出points.png图片文件plot的使用比较直观。首先调用plot.New()创建一个“画布”画布结构如下// Plot is the basic type representing a plot.type Plot struct { Title struct { Text string Padding vg.Length draw.TextStyle } BackgroundColor color.Color X, Y Axis Legend Legend plotters []Plotter}复制代码然后通过直接给画布结构字段赋值设置图像的属性。例如p.Title.Text Get Started设置图像标题内容p.X.Label.Text Xp.Y.Label.Text Y设置图像的 X 和 Y 轴的标签名。再然后使用plotutil或者其他子包的方法在画布上绘制上面代码中调用AddLinePoints()绘制了 3 条折线。最后保存图像上面代码中调用p.Save()方法将图像保存到文件中。更多图形gonum/plot将不同层次的接口封装到特定的子包中plot提供了布局和绘图的简单接口plotter使用plot提供的接口实现了一组标准的绘图器例如散点图、条形图、箱状图等。可以使用plotter提供的接口实现自己的绘图器plotutil为绘制常见图形提供简便的方法vg封装各种后端并提供了一个通用矢量图形 API。条形图条形图通过相同宽度条形的高度或长短来表示数据的大小关系。将相同类型的数据放在一起比较能非常直观地看出不同我们经常在比较几个库的性能时使用条形图。下面我们采用json-iter/go的 GitHub 仓库中用来比较jsoniter、easyjson、std三个 JSON 库性能的数据来绘制条形图package mainimport ( log gonum.org/v1/plot gonum.org/v1/plot/plotter gonum.org/v1/plot/plotutil gonum.org/v1/plot/vg)func main() { std : plotter.Values{35510, 1960, 99} easyjson : plotter.Values{8499, 160, 4} jsoniter : plotter.Values{5623, 160, 3} p, err : plot.New() if err ! nil { log.Fatal(err) } p.Title.Text jsoniter vs easyjson vs std p.Y.Label.Text w : vg.Points(20) stdBar, err : plotter.NewBarChart(std, w) if err ! nil { log.Fatal(err) } stdBar.LineStyle.Width vg.Length(0) stdBar.Color plotutil.Color(0) stdBar.Offset -w easyjsonBar, err : plotter.NewBarChart(easyjson, w) if err ! nil { log.Fatal(err) } easyjsonBar.LineStyle.Width vg.Length(0) easyjsonBar.Color plotutil.Color(1) jsoniterBar, err : plotter.NewBarChart(jsoniter, w) if err ! nil { log.Fatal(err) } jsoniterBar.LineStyle.Width vg.Length(0) jsoniterBar.Color plotutil.Color(2) jsoniterBar.Offset w p.Add(stdBar, easyjsonBar, jsoniterBar) p.Legend.Add(std, stdBar) p.Legend.Add(easyjson, easyjsonBar) p.Legend.Add(jsoniter, jsoniterBar) p.Legend.Top true p.NominalX(ns/op, allocation bytes, allocation times) if err p.Save(5*vg.Inch, 5*vg.Inch, barchart.png); err ! nil { log.Fatal(err) }}复制代码首先生成值列表我们在最开始的例子中生成了二维坐标列表plotter.XYs实际上还有三维坐标列表plotter.XYZs。然后调用plotter.NewBarChart()分别为三组数据生成条形图。w vg.Points(20)用来设置条形的宽度。LineStyle.Width设置线宽这个实际上是边框的宽度。Color设置颜色。Offset设置偏移因为每组对应位置的条形放在一起显示更好比较将stdBar.Offset设置为-w会让其向左偏移一个条形的宽度easyjson偏移不设置默认为 0不偏移jsoniter偏移设置为w向右偏移一个条形的宽度。最终它们紧挨着显示。然后将 3 个条形图添加到画布上。紧接着设置它们的图例并将其显示在顶部。最后调用p.Save()保存图片。程序运行生成下面的图片可以很直观地看到jsoniter的性能、内存占用、内存分配次数各方面都是顶尖的。可能用同一种维度的数据数量级相差不大图像会好看点(┬┬)。注意plotter.Color(2)这类用法。plot预定义了一组颜色值如果我们想要使用它们可以直接传入索引获取对应的颜色更多的是为了区分不同的图形(例如上面的 3 个条形图用了 3 个不同的索引)// src/gonum.org/v1/plot/plotutil/plotutil.govar DefaultColors SoftColorsvar SoftColors []color.Color{ rgb(241, 90, 96), rgb(122, 195, 106), rgb(90, 155, 212), rgb(250, 167, 91), rgb(158, 103, 171), rgb(206, 112, 88), rgb(215, 127, 180),}func Color(i int) color.Color { n : len(DefaultColors) if i 0 { return DefaultColors[i%nn] } return DefaultColors[i%n]}复制代码除了颜色还有形状plotter.Shape(i)和划线模式plotter.Dashes(i)。vg.Length(0)有所不同这个只是将 0 转换为vg.Length类型函数图像plot可以绘制函数图像func main() { p, err : plot.New() if err ! nil { log.Fatal(err) } p.Title.Text Functions p.X.Label.Text X p.Y.Label.Text Y square : plotter.NewFunction(func(x float64) float64 { return x * x }) square.Color plotutil.Color(0) sqrt : plotter.NewFunction(func(x float64) float64 { return 10 * math.Sqrt(x) }) sqrt.Dashes []vg.Length{vg.Points(1), vg.Points(2)} sqrt.Width vg.Points(1) sqrt.Color plotutil.Color(1) exp : plotter.NewFunction(func(x float64) float64 { return math.Pow(2, x) }) exp.Dashes []vg.Length{vg.Points(2), vg.Points(3)} exp.Width vg.Points(2) exp.Color plotutil.Color(2) sin : plotter.NewFunction(func(x float64) float64 { return 10*math.Sin(x) 50 }) sin.Dashes []vg.Length{vg.Points(3), vg.Points(4)} sin.Width vg.Points(3) sin.Color plotutil.Color(3) p.Add(square, sqrt, exp, sin) p.Legend.Add(x^2, square) p.Legend.Add(10*sqrt(x), sqrt) p.Legend.Add(2^x, exp) p.Legend.Add(10*sin(x)50, sin) p.Legend.ThumbnailWidth 0.5 * vg.Inch p.X.Min 0 p.X.Max 10 p.Y.Min 0 p.Y.Max 100 if err p.Save(4*vg.Inch, 4*vg.Inch, functions.png); err ! nil { log.Fatal(err) }}复制代码首先调用plotter.NewFunction()创建一个函数图像。它接受一个函数单输入参数float64单输出参数float64故只能画出单自变量的函数图像。接着为函数图像设置了三个属性Dashes(划线)、Width(线宽)和Color(颜色)。默认使用连续的线条来绘制函数如图中的平方函数。可以通过设置Dashes让plot绘制不连续的线条Dashes接受两个长度值第一个长度表示间隔距离第二个长度表示连续线的长度。这里也使用到了plotutil.Color(i)依次使用前 4 个预定义的颜色。创建画布、设置图例这些都与前面的相同。这里还通过p.X和p.Y的Min/Max属性限制了图像绘制的坐标范围。运行程序生成图像气泡图使用plot可以画出非常好看的气泡图func main() { n : 10 bubbleData : randomTriples(n) minZ, maxZ : math.Inf(1), math.Inf(-1) for _, xyz : range bubbleData { if xyz.Z maxZ { maxZ xyz.Z } if xyz.Z minZ { minZ xyz.Z } } p, err : plot.New() if err ! nil { log.Fatal(err) } p.Title.Text Bubbles p.X.Label.Text X p.Y.Label.Text Y bs, err : plotter.NewScatter(bubbleData) if err ! nil { log.Fatal(err) } bs.GlyphStyleFunc func(i int) draw.GlyphStyle { c : color.RGBA{R: 196, B: 128, A: 255} var minRadius, maxRadius vg.Points(1), vg.Points(20) rng : maxRadius - minRadius _, _, z : bubbleData.XYZ(i) d : (z - minZ) / (maxZ - minZ) r : vg.Length(d)*rng minRadius return draw.GlyphStyle{Color: c, Radius: r, Shape: draw.CircleGlyph{}} } p.Add(bs) if err p.Save(4*vg.Inch, 4*vg.Inch, bubble.png); err ! nil { log.Fatal(err) }}func randomTriples(n int) plotter.XYZs { data : make(plotter.XYZs, n) for i : range data { if i 0 { data[i].X rand.Float64() } else { data[i].X data[i-1].X 2*rand.Float64() } data[i].Y data[i].X 10*rand.Float64() data[i].Z data[i].X } return data}复制代码我们生成一组三维坐标点调用plotter.NewScatter()生成散点图。我们设置了GlyphStyleFunc钩子函数在绘制每个点之前都会调用它它返回一个draw.GlyphStyle类型plot会根据返回的这个对象来绘制。我们的例子中每次我们都返回一个表示圆形的draw.GlyphStyle对象通过Z坐标与最大、最小坐标的比例映射到[vg.Points(1)vg.Points(20)]区间中得到半径。生成的图像同样地我们可以返回正方形的draw.GlyphStyle的对象来绘制“方形图”只需要把钩子函数GlyphStyleFunc的返回语句做些修改return draw.GlyphStyle{Color: c, Radius: r, Shape: draw.SquareGlyph{}}复制代码即可绘制“方形图”实际应用下面我们应用之前文章中介绍的gopsutil和本文中的plot搭建一个网页可以实时观察机器的 CPU 和内存占用func index(w http.ResponseWriter, r *http.Request) { t, err : template.ParseFiles(index.html) if err ! nil { log.Fatal(err) } t.Execute(w, nil)}func image(w http.ResponseWriter, r *http.Request) { monitor.WriteTo(w)}func main() { mux : http.NewServeMux() mux.HandleFunc(/, index) mux.HandleFunc(/image, image) go monitor.Run() s : http.Server{ Addr: :8080, Handler: mux, } if err : s.ListenAndServe(); err ! nil { log.Fatal(err) }}复制代码首先我们编写了一个 HTTP 服务器监听在 8080 端口。设置两个路由/显示主页/image调用Monitor的方法生成 CPU 和内存占用图返回。Monitor结构稍后会介绍。index.html的内容如下 Monitor 复制代码页面比较简单就显示了一张图片。然后在 JS 中启动一个 500ms 的定时器每隔 500ms 就重新请求一次图片替换现有的图片。我在设置img.src属性时在后面添加了一个随机数这是为了防止缓存导致得到的可能不是最新的图片。下面看看Monitor的结构type Monitor struct { Mem []float64 CPU []float64 MaxRecord int Lock sync.Mutex}func NewMonitor(max int) *Monitor { return Monitor{ MaxRecord: max, }}var monitor NewMonitor(50)复制代码这个结构中记录了最近的 50 条记录。每隔 500ms 会收集一次 CPU 和内存的占用情况记录到CPU和Mem字段中func (m *Monitor) Collect() { mem, err : mem.VirtualMemory() if err ! nil { log.Fatal(err) } cpu, err : cpu.Percent(500*time.Millisecond, false) if err ! nil { log.Fatal(err) } m.Lock.Lock() defer m.Lock.Unlock() m.Mem append(m.Mem, mem.UsedPercent) m.CPU append(m.CPU, cpu[0])}func (m *Monitor) Run() { for { m.Collect() time.Sleep(500 * time.Millisecond) }}复制代码当 HTTP 请求/image路由时根据目前已经收集到的CPU和Mem数据生成图片返回func (m *Monitor) WriteTo(w io.Writer) { m.Lock.Lock() defer m.Lock.Unlock() cpuData : make(plotter.XYs, len(m.CPU)) for i, p : range m.CPU { cpuData[i].X float64(i 1) cpuData[i].Y p } memData : make(plotter.XYs, len(m.Mem)) for i, p : range m.Mem { memData[i].X float64(i 1) memData[i].Y p } p, err : plot.New() if err ! nil { log.Fatal(err) } cpuLine, err : plotter.NewLine(cpuData) if err ! nil { log.Fatal(err) } cpuLine.Color plotutil.Color(1) memLine, err : plotter.NewLine(memData) if err ! nil { log.Fatal(err) } memLine.Color plotutil.Color(2) p.Add(cpuLine, memLine) p.Legend.Add(cpu, cpuLine) p.Legend.Add(mem, memLine) p.X.Min 0 p.X.Max float64(m.MaxRecord) p.Y.Min 0 p.Y.Max 100 wc, err : p.WriterTo(4*vg.Inch, 4*vg.Inch, png) if err ! nil { log.Fatal(err) } wc.WriteTo(w)}复制代码运行服务器$ go run main.go复制代码打开浏览器输入localhost:8080观察图片变化总结本文介绍了强大的绘图库plot最后通过一个监控程序结尾。限于篇幅plot提供的多种绘图类型未能一一介绍。plot还支持svg/pdf等多种格式的保存。感兴趣的童鞋可自行研究。大家如果发现好玩、好用的 Go 语言库欢迎到 Go 每日一库 GitHub 上提交 issue
http://www.pierceye.com/news/182117/

相关文章:

  • 网站 关键词 地区seo对网络推广的作用是什么?
  • 网站建设 知乎wordpress woocommerce主题
  • 申请建设工作网站的函如何做网站词库
  • 化工集团网站建设 中企动力网站建设用的服务器
  • wow做宏的网站重庆网址大全
  • 网站建设试题 jsp炎陵做网站
  • 购物网站前台功能模块怀孕单子图片在线制作
  • 做百度推广和企业网站那个有效果吗互动的网站
  • 织梦网站后台怎么登陆磁力兔子搜索引擎
  • wordpress建站必须选择主题磁力引擎
  • 主流网站 技术做爰的网站
  • 网站开发免责合同东莞营销型网站建设公司
  • 网站建设维护培训班网站排名系统
  • 深圳语种网站建设石家庄企业网站建设
  • 长春企业公司网站建设湖北省住房和城乡建设厅门户网站
  • 网站主机名是什么在小说网站做责编
  • 网站建设基本流程信息技术建筑网站设置工资单人换了怎么换
  • 建设银行查余额网站诚信经营网站的建设
  • 平台型网站建设公司最近发生的重大军事新闻
  • 分享惠网站怎么做旅游网站网页设计模板代码
  • 2018年做网站赚钱那些网站做的非常好看的
  • 兰州网站建设哪家专业wordpress耗时
  • 手机网站解析域名网站那个做的比较好
  • 上海专业网站建设公司电话企业营销网站建设的基本步骤
  • 中国专业的网站建设知乎wordpress
  • 广州网站设计公司兴田德润活动这是我做的网站吗
  • html5做网站一线全屋定制10大品牌
  • 广州百度网站建设公司wordpress免费媒体库管理
  • 郑州网站建设炉石在线a视频网站一级a做片
  • 网站越来越难做做杂志的模板下载网站有哪些