0%

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

前言

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

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

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

下文分享链接密码均为: 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数据之比稍微修改少量,以确保数据的准确性

下文对数据修改称为扰动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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函数中实现)。 下面代码尝试了最小化距离之和,还有另一种方法是最小化平均距离:

1
2
3
4
5
6
7
8
9
10
11
12
13
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)
}
}
}

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

1
2
3
4
5
6
7
8
9
10
11
12
13
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