前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >扭曲你的数据,让其变得具有视觉吸引力

扭曲你的数据,让其变得具有视觉吸引力

原创
作者头像
YingJoy_
修改2017-06-19 18:59:26
1.3K0
修改2017-06-19 18:59:26
举报
文章被收录于专栏:应兆康的专栏

前言

本文算是一篇娱乐型的文章吧,并没有牵扯到太多技术性的东西。

本文主要写的是如何扭曲你的数据,在不影响结果和其他属性的情况下,使得你数据画出来的图更加好看。

本文以“兔子”数据为例。

下文分享链接密码均为: yjoy

正文

经常有这样的情况,你用数据画出图像有看起来会很丑,如何让你的图像变得好看一点呢?需要修改点一点。 且这个修改是不能在数据的属性基础上进行修改。在现实生活中该方法的用处在于在做一些数据报表的时候可以令你的报表变得更加清晰好看明了。或者是开发相关数据绘图软件,对数据画出的图进行优化。

上图为“兔子”数据优化后的示例

一、AUTODESK软件介绍(思路)

这是它们的官网

本文的思路来源于AUTODESK

AUTODESK主要是做出计算和图表,致力于让结果更加人性化

左:Anscombe的四张图表

右:非结构化的四张图

两边数据集是相同的,但最终的图像明显存在根本结构和视觉区别。

如今数据的可视化重要性越来越高且越来越流行

在他们的官网上你可以下载到“恐龙”的数据集

下面也给出了“恐龙”数据

数据库集。 虽然形状不同,但每个数据集具有相同的小数点后两位的统计信息(平均值,标准偏差和Pearson相关指数)

对左侧的数据集进行一些小的更改,同时保持相同的统计属性(小数点后两位)

将随机的点转换为圆,同时保证数据具有相同的特征

**创建数据集。 输入是左侧的“恐龙”数据集,中间是一组目标形状。 最终数据集显示在右侧。 所有数据集和动画的所有帧具有相同的统计

其中(x mean = 54.26,y mean = 47.83,x SD = 16.76,y SD = 26.93,Pearson's R = -0.06)。**

下图为最终整合在一起的结果

好了,其它更多的你们可以去它的官网看

开始写代码(本文使用R语言)

先说说想法

将x的数据和y数据之比稍微修改少量,以确保数据的准确性

下文对数据修改称为扰动

代码语言:txt
复制
check_prop=function(new_pts, is_x)
{
if (is_x)
   return(abs(myx_mean-stat_cond(new_pts)) < 0.01)
else
   return(abs(myy_mean-stat_cond(new_pts)) < 0.01)
}
 
 
mv_pts=function(pts)
{
repeat
   {
   new_x=pts$x+runif(num_pts, -0.01, 0.01)
   if (check_prop(new_x, TRUE))
      break()
   }
 
repeat
   {
   new_y=pts$y+runif(num_pts, -0.01, 0.01)
   if (check_prop(new_y, FALSE))
      break()
   }
 
return(data.frame(x=new_x, y=new_y))
}

我们需要改动的数据点,在下面称为扰动点

然后需要计算扰动点与目标点位置之间的距离。 对于每个扰动点,需要找到目标中最近的邻居并计算距离。 这可以在nlog(n)中使用K-D tree(一种数据结构)完成,当然还有一个R语言的相关包,RANN,这样做(在nn2函数中实现)。 下面代码尝试了最小化距离之和,还有另一种方法是最小化平均距离:

代码语言:txt
复制
mv_closer=function(pts)
{
repeat
   {
   new_pts=mv_pts(pts)
   new_dist=nn2(rabbit, new_pts, k=1)
   if (sum(new_dist$nn.dists) < cur_dist)
      {
      cur_dist <<- sum(new_dist$nn.dists)
      return(new_pts)
      }
   }
}

现在它就变成了一个循环迭代次数的问题,如果距离低于某个限制标准,则存在

代码语言:txt
复制
iter_closer=function(tgt_pts, src_pts)
{
cur_dist <<- sum(nn2(tgt_pts, src_pts, k=1)$nn.dists)
cur_pts=src_pts
for (i in 1:5000)
   {
   new_pts=mv_closer(cur_pts)
   cur_pts=new_pts
   if (cur_dist < 13)
      return(cur_pts)
   }
return(cur_pts)
}

此代码处理单个属性。 上面AUTODESK的开发者利用原始模型在实施该过程中花费了一个多小时的时间,同时处理多个属性,并使用模拟退火算法来防止死循环在本地的最小值中。

下面是例子,原始点位黄色

对图像进行修理一下就可以变得很好看

相关下载

这是“恐龙”数据

这是“兔子”数据

这是“本文代码”

说明

这个方法对于那些对数据精度要求很高的系统是不能使用的

理由很简单:)

YingJoy

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 正文
  • 一、AUTODESK软件介绍(思路)
  • 开始写代码(本文使用R语言)
  • 相关下载
  • 说明
相关产品与服务
腾讯云 BI
腾讯云 BI(Business Intelligence,BI)提供从数据源接入、数据建模到数据可视化分析全流程的BI能力,帮助经营者快速获取决策数据依据。系统采用敏捷自助式设计,使用者仅需通过简单拖拽即可完成原本复杂的报表开发过程,并支持报表的分享、推送等企业协作场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档