最近更新了两次corrplot包,最新的0.60版本较之前的0.40进步较多。之所以取名为0.60版本,意味着此包的自评分终于上了60的及格分数,也有可能是这个包的最终版本。corrplot的应用范围很明确,就是中小矩阵 (<100*100) 的可视化,尤其是中小相关矩阵、距离矩阵、相似度矩阵等。

本次主要变动如下:

  1. 彻底解决了空白边距过大问题(尤其在文本标签较长时候),这个是个历史遗留问题,之前的方法比较原始简陋,已经有好多人发邮件投诉了(要不我也没动力更改);现在迭代来计算strwidth直至收敛,可以精确计算文本的长宽度了。控制文本大小的参数 tl.cex 也更精准了。
  2. 修订了参数名称和帮助文档,之前的参数取名、帮助文档太随意了。比如”PCA”排序就会让人错觉以为是第一主成分,目前更改成了更为妥当的”AOE”,是angular order of the eigenvectors的意思,具体参见文档。而第一主成分用”FPC”来表示了;此外,从效果来看,”AOE”排序结果一般都比”FPC”要好。提到矩阵排序,seriation包已经很NB了,更多方法可以参见此包。PS: 作者之一Kurt Hornik是R Core之一,是CRAN的主要维护人,每天都要check、答复新进来的包,德艺双馨、产出惊人,是绝对的教授中的战斗兽。
  3. 增加了zoom参数,来放缩原矩阵,使之可以轻松地应用到非[-1,1] 的矩阵;同时增加了参数cl.lim,使得颜色轴标签上只显示需要展示的部分。当然,此时颜色轴上的标签也会和缩放前的一样。
  4. 增加了横轴文本标签的旋转角度参数tl.srt,这个我虽不喜欢,但有人希望加这个方便阅读。总结来看,corrplot的每次更新都是有人发邮件说需要这样那样的功能……
  5. 增加、删除了一些函数。主要是加了corrMatOrder() 和corrplot.mixed () 函数来做矩阵排序和混合可视工作。删除了corrplot.*()系列不那么常用的函数。
  6. 进一步优化了代码并谨慎地选择了各个参数的默认值。虽然这个没有什么技术难度,但因为涉及到的很多都是绘图,审美之类的对我这种时常喜欢纠结的土人实在很麻烦…… 其实,更新最多的时间竟然花在了默认参数的选择之上,这个可能和我的星座有关!!

可视化是数据&模型&结果的美学展示,其中在图形展示这一块主观性较强,因此corrplot很注重各个细节,提供了很多选项让大家自己选择。但就因为这这样,corrplot函数的参数多达43+个,显得很累赘。这就是所谓的双刃剑吧。

此外,为了体验GitHub,我把corrplot主页从Rforge上迁移到了GitHub: https://github.com/taiyun/corrplot 如果有什么问题或者新的需求请到Issues那里提出。

再此外,我把R与最优化的文档也放在GitHub上了: https://github.com/taiyun/Optimization-using-R ,我自己近来空闲时间很少了,希望感兴趣的同学能对这份文档增删添补,以方便大家快速、便捷地查阅、使用。

为了使得本博文不那么呆板,文末以图会友吧:

 

先来一个绣花枕头(并非贬义)版本,当置信上下界(下图中为95%)同正同负时,勾勒一个圆环,外圈所围面积为置信上界,内圈所围面积为置信下界。当置信上界和下界符号不同时,画两个圆,先画绝对值较大的,再画绝对值较小的,并用不同颜色以示区分-,这样以来,上下界皆可看清,并且跨越0的置信区间对应的图就不是圆环了。图中的红叉表示不显著的系数(a=0.05)

上图看来新奇,但展示置信区间还是用长度直观明了,下图为不同置信水平下置信区间的动画演示。每个矩形上下边的黑线分别为上下置信界,中间的黑线(并不是上下界的均值!)为相关系数大小,水平的点划线为0基准线。随着置信水平(1-a)的增大,置信区间长度不断增大。

该gif动画较大,440k左右,网速慢的可能得稍候几秒,pdf版本见此

更多例图,参见我的Google Docs,共56张图形,恰合我华夏名族之数目(美其名曰corrplot华夏图?)。国内google docs 在线查看速度可能比较慢,下载后用pdf浏览器全屏观看效果为佳。

上面的所有图片代码都在corrplot-0.3版本之中,目前还没有在CRAN上,Rforge估计还得一两天。(注:现在已在了)

近来生成swf、gif等动画都是animation之功劳,很是方便,感谢YH:)

———————————–分割之—————————————
corrplot 0.3版本变动如下:

1. 发现原来代码有些地方还是累赘,还有小bug,精简并kill 了一下bug,目前没有一个for循环(这种仇视for的心态或许并不好)。
2. 原来变量名起得不好,这次大动了手术,争取见名知意,且能迅速记住,并不发生混淆。
3. 进一步做好细节工作,主要是文本标签和颜色标签,提供了更灵活的布局方式,从上面提到的corrplot华夏图中即可见端倪,比如颜色棒可选择在右或下,并可以自由控制宽度。

目前的corrplot包一个优点是很灵活,可以自由控制很多东西;但同时,这个优点也是成了它最大的缺点,那么多参数,看得人眼花。

 

最近做毕设,做着做着和社会网络搭上边了,发现这东西很好玩,并且很实用。在丽云的建议下抓取了2004年以来国内三大经济学期刊(经济学季刊、 经济研究、 世界经济)的合作作者数据,在igraph包中用复杂网络领域的大牛Newman等人的速度超快的社团结构分割算法(igraph中是fastgreedy.community()函数)画出了其中一个最大网络 的社团结构图 ,并按照社团数目画了25张图。这张图包括396个作者,652条边。

中国三大经济期刊2004年以来合作作者社会网络图之一

点击gif图片,可看flash版本,比较清晰。PDF版本在这里,下载后以幻灯片形式全屏来看,一张一张放映比flash版本更舒服,并且可以随时叫停,随时加速。tips:看官注意图中的一些细节,比如形状、主体颜色、轮廓颜色,其中暗藏机关。

再放两个变种:

中国三大经济期刊2004年以来合作作者社会网络图之二

中国三大经济期刊2004年以来合作作者社会网络图之三

点击可看flash版本,PDF版本在此:pdf-1pdf-2。其中加了边框的图是根据散点形成的凸集弄的(chull()函数),有时两个类别的凸几何图形有所重合,不太养眼。加了阴影的图是投机取了巧,把每个节点放大作为背景色的,但是效果还行。

最后,再放个以作者名字为节点标签的图,见此或次(19个社团的)。可以不用辛辛苦苦根据门牌号对号入座了,不过由于文字较小,可能需要放大查看。

——————————————分割之————————————————

注1:近五年的数据中包括很多互相独立的子图,这里仅仅画出一个最大的(396个顶点),其他的没有画出,具体细节见下表。

顶点数 1 2 3 4 5 6 7 8 9 11
频数 335 207 102 49 24 17 12 4 4 3
顶点数 12 14 15 16 20 22 23 55 396  
频数 2 3 1 1 1 1 1 1 1  

注2:刚好丽云画了国外经济学期刊的社会网络图,见此或此

注3:该算法表示在社团为19的时候最为合适,图中的聚类信息(给出的是在社团数目为19的时候)和IDs代号如下(代号越大,发表文章越多,比如樊纲的id是384,林毅夫的id是394,龚六堂的是393,都算是刊霸级人物),希望经济学的朋友们看看是否符合实情:

  • 第1类(size=46):
  • WarwickJ.Mckibbin(7), 蔡志洲(12), 陈烨(20), 陈瑜(21), 关志雄(36), 国务院发展研究中心课题组(39), 胡嘉妮(47), 李宏艳(63), 罗德明(95), 沈懿(105), 史宇鹏(108), 苏剑(112), 陶婧(117), 王荣艳(125), 威廉•布莱福特(137), 魏强(138), 沃维克•麦克吉宾(140), 小川英治(146), 曾道智(166), 张辉(169), 张健华(171), 张艳花(174), 张燕(175), 张永生(176), 陈超(198), 陈漓高(200), 顾全林(214), 金祥荣(224), 刘鹏(231), 刘世锦(232), 罗凯(236), 汪伟(248), 张怀清(271), 胡永泰(287), 朱希伟(313), 齐俊妍(319), 汪淼军(325), 王小鲁(328), 谢平(329), 姚枝仲(332), 贺力平(339), 刘伟(343), 张维迎(348), 朱玲(364), 周黎安(383), 樊纲(384)

  • 第2类(size=42):
  • 丁维莉(25), 何俊志(43), 贺小海(45), 蒋仕卿(58), 李珍珍(75), 齐佩金(100), 宋铮(109), 汪汇(121), 王志强(135), 邢予青(149), 严冀(156), 杨真真(159), 余央央(165), 张藕香(173), 赵剑治(181), 陈敏(201), 邓可斌(205), 樊潇彦(210), 桂琦寒(216), 何立新(219), 何樟勇(220), 刘永平(234), 孙刚(244), 吴桂英(253), 殷醒民(264), 张吉鹏(272), 张爽(275), 丁菊红(285), 金煜(289), 夏纪军(297), 许庆(300), 佐藤宏(314), 刘修岩(318), 袁志刚(333), 封进(337), 张茵(349), 张晏(361), 王永钦(369), 章元(382), 万广华(390), 陈钊(392), 陆铭(395)

  • 第3类(size=39):
  • 蔡颖义(11), 曹广忠(13), 单伟(23), 高坚(32), 何学中(44), 姜烨(57), 雷•布鲁克斯(61), 刘永东(88), 陆曦(94), 邵挺(103), 苏福兵(110), 田士超(118), 王世华(128), 王勇(132), 危结根(136), 吴庆堂(142), 余乐安(164), 冯维江(211), 鞠建东(225), 李志赟(227), 汪晖(247), 徐高(257), 徐晋涛(258), 余永定(266), 袁飞(268), 孙希芳(292), 覃东海(293), 余淼杰(304), 张鹏飞(308), 张斌(334), 龚刚(353), 何帆(354), 徐志刚(359), 张曙光(360), 潘士远(367), 陶然(368), 章奇(374), 刘明兴(379), 林毅夫(394)

  • 第4类(size=33):
  • 冯俊新(30), 黄文平(50), 黄新飞(51), 黄怡胜(52), 江舒韵(54), 李正仕(76), 刘霖林(82), 石晓军(107), 苏桂富(111), 孙建军(113), 夏晓华(145), 徐勇(152), 余军(163), 张安民(167), 周天芸(186), 朱洁瑜(190), 李捷瑜(226), 刘涛(233), 梅松(240), 孙群燕(245), 王红领(249), 王贤彬(251), 张顺明(276), 赵永亮(278), 李稻葵(290), 云鹤(306), 王美今(327), 才国伟(336), 李郇(340), 王曦(358), 李杰(378), 徐现祥(380), 舒元(389)

  • 第5类(size=33):
  • 杜敏杰(26), 黄群慧(49), 李恩平(62), 李琴(69), 李义学(72), 李增刚(74), 林跃勤(79), 罗凤金(96), 吴太昌(143), 张慧莲(170), 张自然(177), 钟宏武(184), 常欣(195), 陈昌兵(197), 韩孟(218), 汤铎铎(246), 王宏淼(250), 谢志平(255), 袁富华(269), 中国社会科学院经济体制改革30年研究课题组(279), 陈佳贵(283), 韦倩(295), 张磊(307), 黄少安(316), 孙涛(322), 汪红驹(324), 王海港(326), 刘树成(342), 张平(372), 张卓元(373), 中国经济增长与宏观稳定课题组(375), 张晓晶(386), 刘霞辉(387)

  • 第6类(size=33):
  • 薄仙慧(10), 黄张凯(53), 姜神怡(56), 康季军(59), 康继军(60), 林细细(78), 林忠晶(80), 刘寅(87), 鲁臻(92), 缪新琼(99), 汪锋(120), 王胜(127), 王燕(131), 肖军(147), 谢丹阳(148), 许雄奇(154), 薛彤(155), 杨云红(158), 周春生(185), 白云霞(193), 尹恒(265), 陈晓光(284), 王弟海(294), 徐信忠(298), 严成樑(301), 杨俊(302), 张宗益(309), 周炎(312), 王亚平(346), 邹恒甫(350), 陈昆亭(351), 吴联生(370), 龚六堂(393)

  • 第7类(size=27):
  • 陈波(16), 韩冰洁(40), 何建武(42), 侯永志(46), 姜德增(55), 李金波(65), 刘云中(90), 卢周来(91), 芮明杰(102), 孙艳梅(115), 王宇锋(133), 吴玉立(144), 杨其静(157), 张俊妮(172), 罗雨泽(238), 行伟波(256), 许召元(260), 薛求知(261), 杨瑞龙(263), 朱善利(281), 罗来军(291), 谭松涛(323), 邢春冰(330), 李善同(341), 陈玉宇(352), 聂辉华(355), 郑志刚(363)

  • 第8类(size=25):
  • 傅雄广(31), 郭凯(37), 郭美新(38), 黄玲文(48), 沈明高(104), 师慧丽(106), 王曲(124), 王小康(130), 王泽填(134), 余海丰(162), 章林峰(178), 赵英涛(182), 郑东雅(183), 朱海婷(188), 朱诗娥(192), 陈斌开(196), 和云(221), 刘民权(230), 沈艳(242), 许伟(259), 徐忠(299), 杨汝岱(331), 高梦滔(338), 施建淮(357), 姚洋(385)

  • 第9类(size=21):
  • ArneBigsten(1), 高宇宁(33), 刘生龙(83), 刘涛雄(84), 刘晓东(86), 钱陈(101), 孙柳媚(114), 田新民(119), 王少国(126), 吴凡(141), 许海萍(153), 朱慧(189), 杜立民(209), 王亚华(252), 董雪兵(286), 杨永恒(303), 张宁(335), 王争(347), 郑京海(362), 胡鞍钢(376), 史晋川(388)

  • 第10类(size=16):
  • ErikaMeng(3), MichielKeyzer(6), WillMartin(8), WimvanVeen(9), 刘宇(89), 罗斯高(97), 米建伟(98), 王金霞(123), 朱莉芬(191), 仇焕广(204), 刘承芳(229), 罗仁福(237), 杨军(262), 张林秀(274), ScottRozelle(282), 黄季焜(365)

  • 第11类(size=15):
  • 陈工文(18), 陈敏彦(19), 邓永旭(24), 范瑛(28), 关晓静(35), 郝朝艳(41), 李胤(73), 尹静(160), 章椹元(179), 周艺艺(187), 郭锐欣(217), 梁爽(228), 毛亮(239), 张海洋(270), 平新乔(356)

  • 第12类(size=13):
  • 陈高才(17), 樊茂清(27), 李洁(64), 林黎(77), 覃筱(116), 徐楠楠(151), 余芳东(161), 柏满迎(194), 黄薇(222), 蒋云赟(223), 郑海涛(311), 孙琳琳(321), 任若恩(391)

  • 第13类(size=10):
  • B•古斯塔夫森(2), 古斯塔夫森(34), 李利英(67), 刘京军(81), 邓曲恒(206), 丁赛(207), 董晓媛(208), 魏众(296), 岳希明(305), 李实(366)

  • 第14类(size=9):
  • 曹跃群(14), 陈仲常(22), 李敬(66), 李伶俐(68), 王定祥(122), 温涛(139), 熊德平(150), 吴永球(254), 冉光和(320)

  • 第15类(size=9):
  • GaryH.Jefferson(4), 方红生(29), 王世磊(129), 张弘(168), 陈诗一(202), 傅勇(212), 高远(213), 桂林(215), 张军(381)

  • 第16类(size=8):
  • 赵波(180), 陈磊(199), 石磊(243), 张剑(273), 张涛(277), 周敏(280), 王学斌(345), 寇宗来(377)

  • 第17类(size=7):
  • 李双杰(70), 陆挺(235), 袁诚(267), 赵农(310), 刘小鲁(317), 刘小玄(344), 吴延兵(371)

  • 第18类(size=5):
  • M.S.Qureshi(5), 常斌(15), 李妍(71), 缪小林(241), 伏润民(315)

  • 第19类(size=5):
  • AbdullahiD.Ahmed(0), 刘西川(85), 陆文聪(93), 程恩江(203), 黄祖辉(288)

 

更新了一下corrplot包,变动如下:

1.  解决了之前的一些小bug,并且把原来的一些for()循环用*apply函数重写了一下。
2. 增加了corr.rect()函数,可以在相关阵的图上面框框,类似于谱系图上面的那种矩形,即将原来的多个变量分为n类。这两种图(见图1、图2)可以好好比较一下,各有特点。
3. 在原先的corrpot()函数中,当排序方式为系统聚类时,可以根据聚类结果直接加框框,具体由rect.hc, rect.col, rect.lwd三个参数控制。当然,也可以在图画完之后,用corr.rect()函数再加,只不过方便性上打了折扣。

目前,CRAN主页上新版已经出炉,国内中科院的两个镜像还没有同步,大约得半天左右吧(香港那个镜像早已废弃)。此外,WINDOWS下默认的图形设备在绘制png等非矢量格式图时,效果欠佳,建议用Cairo包或者cairoDevice包来生成质量较高的png图片。

图 1 corrplot画出来的

图1代码如下:

corrplot(cor(mtcars), order="hclust", rect.hc = 3)

图2 传统的聚类谱系图,可以与图1好好比较一番


再放一个图1和图2的联姻图:

图3 二者之联姻,和heatmap有些相似

corrplot包的其他问题:

1. DESCRIPTION文件里面的suggests package里面不小心加了个rgl包,悲剧悲剧。
2. corrplot()函数参数过多,现在是38个左右,很多时候我自己都要返回去看看参数意义,显得比较累赘。
3. 变量的文本标签的计算方法不太好,有时得多次调解cex参数,比较麻烦,这个是个比较大的问题。
4. 之前,准备多做做变量排序的事情,后来发现seriation包已经做得非常好了,其中一位作者Kurt还是R core之一,每次提交package时,几乎都是他把关。corrplot包的定位还是轻量级,在维数<50的时候娱乐娱乐。

欢迎广大朋友批评指正。

 
之前,corrplot包(部分效果见此)只能通过Rforge下载:

install.packages("corrplot", repos="http://R-Forge.R-project.org")

目前小bug都找的差不多了,加上近来比较忙碌,故打算提交到CRAN(大约五天之内会到CRAN上露脸吧),需要此包的朋友们就不用发email给我原始数据让我代劳了

此包以后的更新方向主要是变量的重排序方法:

1. Robinsonian
2. Dimension reduction
3. Heuristics
4. Block modeling
5. TSP

现在已经实现了主成分排序和各种系统聚类排序,其他的还得边学边卖,慢慢更新。相关矩阵可视化竟然能扯出这么多数学、统计甚至图论的东西,之前从没想到过,真是好玩。

注1:最初是在R会议上看见bjt大哥用椭圆图来表示相关矩阵,那时觉得很新鲜、很好玩,记忆很深刻。后来随便想了一阵子,写了个小函数来娱乐,却没想到滚雪球滚成了一个小package。

注2:曾经觉得自己折腾得太久了,很无聊,不过现在又觉得很好玩了,因为还有很多有趣的工作要做。

注3:corrplot包在Rforge上最近不太好用,等我忙完手头的事立即更新。

 
前两周在北大上可视化的暑期班,有幸和五湖四海的朋友们一起聆听Kwan-Liu Ma、Han-Wei Shen、Alex Pang、Michelle Zhou、Hua-min Qu、Jean-Daniel Fekete、Jian Huang、田捷等老师的教诲,这些老师、研究人员在各自的领域内都非常优秀,部分还是界内大牛,更可敬的是他们都对学生很有感情、很有耐心——标准的德艺双馨。

整个暑期班的学习中,课程包含流体可视化、张量可视化、医学影像、信息可视化、时变可视化、智能可视化、并行可视化等很多方面,其中我最感兴趣的是:Jean-Daniel的Visualizing Social Networks using Hybrid Matrix/Node-Link Representations,因为和我之前的工作颇有渊源。

Jean-Daniel在做social network的时候,用到了类似相关矩阵可视化的东西,就是将两两之间的关系数字化,得到一个相似度矩阵,然后可视化这个矩阵。social network的传统做法是画个网络图,用节点和连线来表示,但这样很容易使整个图变得乱七八糟,什么也看不清。可视化相似度矩阵的方法则不存在这个问题,当然也会带来新的麻烦。

对于相似度矩阵的可视化,主要存在两个问题:
1. 如何用颜色、图形、线条表示这个矩阵,;
2. 如何对矩阵对应的变量进行重排序,使得相似的变量聚在一起,不相似的分开,这样我们可以通过可视化的图形直观地发掘变量之间内在的关系。

其中,第一点已经很成熟了,就是用方块、圆,再辅之以渐变色等,corrplot包的初期也就是做这些工作;而第二点,即如何重现排序变量,这会涉及到统计、数学知识,也是本问题的精髓之所在。之前,我仅知道用PCA、聚类等方法重排变量,也在corrplot包中实现了。而现在,我发现重排变量是个不小的问题,因为它本身非常重要,而PCA、聚类方法有时在效果或者速度上并不占优势,这就需要我们探索其他方法。Jean-Daniel在课堂上介绍了两个, Robinsonian和TSP。Robinsonian是个很数学的东西,我暂时还没有翻看论文,但是TSP(Travelling salesman problem)大家都再熟悉不过了,把这个东西灵活地用在变量排序中,的确是别出心裁,匪夷所思!!相似度、相关系数等本身都是距离,而TSP问题恰恰求最短路的。

TSP是个NP问题,但很幸运的是,我们目前已经有很多算法可以快速得到不错的解,R中有相关的包(TSP),包含了常见算法并提供了concorde软件(解TSP问题的优秀开源软件)的接口。这样一来,写个用TSP排列变量函数就方便很多了。

当然,除了TSP问题的求解难度问题之外,它在变量排序中还存在一个问题,就是TSP问题求出的最短路是个环线,所以在重排序的变量中,第一个和最后一个可能很相似,但在图中,它们一个最上、一个最下,离得最远。这个问题可以这么解决:

1. 不在一张图上吊死。用至少两张图,第二张图的变量顺序是第一个图的水平移动,比如第一个图中(A, B, C, D, E),而第二个图则是(D, E, A, B, C),这样第二个图中E和A就在一起了。当然,我们也可以通过观察图形,得到一个最容易接受的排序。这虽然是个解决方法,但是人总是贪婪而又懒惰的,一张图能看清楚的,绝不会看两张图,因此还需要探索一张图的方法。

2. 不在一个算法上吊死。既然TSP可以,那么图论中经典的Dijkstra 、Floyd算法也很可能适用,虽然这两个算法不是穷尽各个节点的,而是求各个节点之间的最小路程。比如,我们可以通过这两个算法辅助TSP算法确定起点和终点:我们可以求出网络中任意两点间的距离,然后找出最大距离所对应的两个节点。然后,将距离矩阵中这两个节点所对应的距离修改为0,这样得到的结果中这两个节点肯定挨在一起,这相当于将TSP环路算法转换为非环路算法。然后,将这两个节点分别设置为头尾,就可以得到一个粗糙的结果了。我在R中试了试,基于经典的mtcars数据,将得到的图展示出来:
vis-tsp-pca
从上图可以看到,两种排序方法还是比较相似的,并且效果都不错。这样确定起点终点的好处是,起点和终点对应线路是所有两两路程中最长的,这样再用非环线的TSP算法就不容易使排序失去意义。当然,这种方法还是很粗糙,比如计算量过大。实际中,我们可以通过别的方法更快地确定起始点和终点。

3. 不在一种介质上吊死。常见的纸、屏幕是平面的,如果我们有圆柱形式的立体介质,那么TSP得到的变量重排序就很有舞台了。将图绘制在圆柱上,首尾相接,看的时候转动圆柱即可。这个方法听起来的确有些扯,但是我觉得这种介质的出现不是没有可能(实际上,一些路边的广告就是这样的),当然这种方法的局限性也很大。

等手头的杂事忙完的话,corrplot也会逐步更新,添加一些变量排序的新方法。可视化不是简单的画图,背后的算法、模型非常重要

注:
1. 已经有很多文献讨论了矩阵的重排序,不过我都没看,先自己折腾一番。
2. 本文之前写得不太明了,因此重新修改了,2009-08-27,19:16。

 
square-vis

新图一张,还是关于相关阵的。

 

一直觉得圆圈图听来不雅,也没有“闪电图”那么响亮的名字,不料却受到了许多前辈们的关怀议论,叫好的不少,提出批评意见的也不少。从中,我发现了一个秘密:人们的视觉系统是有差异的!同一个图,在某些人眼里好,而在其他人眼里就不一定舒服了。所以,我把原先的函数升级了,添加了背景颜色和填充颜色两个参数,用户可以自行选择适当的参数,当然后果自负。

许多朋友反映负相关系数的白色圈子淹没在白色背景里了,不怎么显眼。受中国围棋的启发,把背景设置为鹅黄色,发现效果不错。这样圆圈图就有个扬眉吐气的名字了:围棋图。

chinese-go

更多关于相关阵的图片参见我的Picasa 图片集,欢迎评价!

跑题一下:Google 万岁。Google的Serch、Gmail、Groups、Blog、Maps、Reader、Docs、Picasa、Gtalk都非常好用,并且都免费。太喜欢google了!

© 2010 优秀是一种习惯 taiyun.wei@cos.name Suffusion theme by Sayontan Sinha