前天晚上发出一篇质量平平的博文后, 太云学长提出一个建议(其实算是中肯的批评): 用点的大小表示震级的大小. 其实以前也不是没想过这个问题. 只是不怎么懂R中的向量操作, 加上自己比较懒, 所以就 … 昨天没去教室学习(极度堕落啊), 正好宅在寝室里没事, 就画出来玩玩.
我们首先绘制图1, 点的半径大小代表震级的高低. 点的半径越大, 震级越高. (数据附文后)
然后绘制图2, 点的透明度高低代表震源的深度, 点的透明度越靠近完全不透明 (完全不透明的红色为#FF0000FF), 表示震源深度越浅.
绘制图3, 点的半径大小表示震级的大小, 各点颜色透明度的不同表示震源的深度.
事实上, 三张图的区别极小, 区别就在于绘图参数中bg和cex两个参数的不同.
值得注意的是, 我发现, 使用透明度区分颜色(震源深度)而不是使用纯粹的渐变色(如黄色到红色)区分颜色的一个特点是, 点在叠加的部分会显示得更“深”更“亮”, 在颜色上的体现也就是更加的不透明. 如果你的显示器性能足够强悍, 对比度足够高, 那么可能相对分辨得比较清楚(虽然硬件因素在这个特例中不是很重要, 但这个特性的确是与硬件有一定关系的). 如果效果不是特别明显, 你仍然可以尝试调整一下显示器和眼睛的角度: 将(笔记本的)显示器放得非常平(几乎与视线平行). 你会发现, 其他点都已经变得与底色区别不大的时候, 图3正中偏左下部分(即青海玉树地区)以及一些有叠加的地区呈现一种更深的黑色. 而且, 这种性质与有叠加区域所在的图中位置, 即人们具体视角的关系很小, 不信你可以把图3上下部分互换一下. 至于叠加会产生这种效果的深层次原因, 我想应该是对应着一个光学上的某种简单原理(应该早有人提出了), 但是具体的原理如何表达, 我不得而知, 不过我猜想应该是透明度(alpha)有一种可以累加的性质吧.
当然, 这种不同透明度的叠加几乎没有什么意义, 因为两次不同地震的震源深度数据相加是没有什么意义的. 最多能够给人们一个大致的印象, 那就是哪里的地震发生比较频繁. 当然, 如果你愿意的话, 也可以理解成, 同一个地方发生了那么多次地震, 以破坏力累计, 相当于震源深度越来越浅了.
抛开叠加的因素, 以颜色的透明度区分单独看起来还有点意义, 那就是震源深度浅(透明度较低), 破坏性强的地震将更吸引眼球, 换个最贴切的词就是更Significant一些.
我们说, 如果有这样一个数据集, 满足: 1. 能够稍微让点在空间上散开一些, 至少让我们可以较好地区分开不同的点; 2. 透明度不同的颜色序列的间隔再大一些, 也就是不同透明度之间的区别更明显一些, 那么使用这种透明度的渐变我觉得可能还是有点意思的.
我的另外一个观点是, 从根本上讲, 很遗憾, 虽然不能算是严重的误导, 但这种点的大小和颜色的区别并不能够让我们产生完全理性的认识, 而最多只能算是一种示意和参考. 也就是说, 这种表示方法本身就是有问题的. 我们知道, 震级的表示是取了对数的, 也就是说, 震级每增长一级, 释放的能量将增长超过一个数量级, 约为上一级释放能量的30多倍. 图中并没有一个量能够完美地体现这一点, 让人更无奈的是, 我觉得人们对点的半径大小和面积的感知可能还存在着敏感与不敏感的问题等等. 由于我实在是不懂可视化, 就不再继续痴人说梦了.
附
附1. 数据说明
数据条目: 354
时间跨度: 2010年3月23日-4月23日
经纬度范围: 31°-39°N, 94°-103°E
震源深度单位: Km
震级度量: 面波震级Ms
数据来源: 国家地震数据共享中心
为了可以直接执行下面的R命令, 解压后, 将data.csv放入R的工作目录. 这个目录在Windows环境下一般是:
X:\Documents and Settings\Your User Name\My Documents\
附2. 绘图过程
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 | # Required Packages: # sp/rgdal/RgoogleMaps # Data Proc. markerdata <- read.csv("data.csv") boundingbox <- qbbox(lon = markerdata[, "lon"], lat = markerdata[, "lat"]) EQMap <- GetMap.bbox(boundingbox$lonR, boundingbox$latR, destfile = "EQ.png", maptype = "satellite", zoom = 6) dep <- as.vector(markerdata$dep) # Plot begin # Radius = Ms result1 <- PlotOnStaticMap(EQMap, lon = markerdata$lon, lat = markerdata$lat, pch = 21, bg = "red", cex = markerdata$ms, col = "black", verbose = 0) Sys.sleep(3) # Color = Depth result2 <- PlotOnStaticMap(EQMap, lon = markerdata$lon, lat = markerdata$lat, pch = 21, bg = dep, cex = 1, col = "black", verbose = 0) Sys.sleep(3) # Fig 1/2 Hybrid result3 <- PlotOnStaticMap(EQMap, lon = markerdata$lon, lat = markerdata$lat, pch = 21, bg = dep, cex = markerdata$ms, col = "black", verbose = 0) # End |
附3. 颜色透明度使用的简要说明
观察数据得震源最大深度25km, 最小深度1km. 生成一个长度为25的向量, 最小值15, 最大值255. 以此向量作为rgb()函数的参数alpha(透明度), R=255, G=0, B=0.
在R中生成上述颜色:
1 2 | alpha <- seq(15, 255, 10) x <- rgb(255, 0, 0, alpha, maxColorValue=255) |
向量x中存储了25种颜色的16进制表示(每个元素大致是”#FF00000F”这样的形式). 我们得到的25种颜色如图4所示.
这里提一句, 点的缩放参数cex直接使用了Ms震级数据, 在其他图中为了看得更清楚或许需要做一个线性变换, 我觉得在这张图里直接用震级数据作为参数cex就差不多了.
我不懂数据框和向量操作, 所以直接将生成的颜色向量换入了上面的数据, 你可以通过代码实现. 最后解释一下标题, 其实标题本身是没有什么意义的, 《小径分岔的花园》是博尔赫斯的一个短篇, 代表了我的R绘图零基础在昨天做图时的蜿蜒曲折和无语之极 ..





这只是个两维数据的展示,还算不上高维吧..
而第三个图,我仔细看了,透明度几个点叠在一起的话,真的不好辨认,建议用颜色标尺,边上对不同颜色变化进行图例说明可能还好些
其余还做得不错,我还没有过Rgooglemaps这个包
[回复]
Nan.Xiao 回复:
四月 25th, 2010 at 18:19
是啊, 维度很低, 矬矬的 .. 下次做个1000000维的吧 .. 不过应该是没有下次了.
不用颜色标尺的原因一是我孤陋寡闻, 随便瞎做一下; 其二我是懒得看图例的人, 你没觉得以前我有什么图看不懂都直接去问你们了么? 其三试想如果有10000个颜色不同的点要打上去, 用颜色标尺会不会很糟心呢? 这和这种图的背景色也有关, 我分辨五颜六色的能力很差. 其实可以做个实验验证一下, 不过这其实是你们这些搞可视化的人的任务了, 我就是那么随便一玩, haha
[回复]
gaotao 回复:
四月 26th, 2010 at 15:33
没有没有,你的可视化比我好多了。我已经很久没有碰那个东西了。好好加油
[回复]