一 : 观点:人妖阻止网游“淫媒化”的第一防线
上帝创造游戏世界的第七天,原本休息,突发奇想说道:“要有人妖”,于是,在网络游戏中有了人妖!游戏世界里最可爱的人!
从哲学角度来说,存在即合理,从网络游戏诞生开始,就已经出现的人妖现象,本身有着其存在的合理必然性。你永远不知道在电脑终端的那头,和你聊天的是一条狗还是一个人,其实也永远没有必要去知道。而网络游戏世界最迷人之处恰恰在于这一道虚无缥缈。当一切神秘面纱都被揭开以后,其实网络游戏也就失去了色彩。
而人妖的出现恰恰成了应景之物,不可否认,人妖的诞生原因有很多,有的是为了能够骗取同性玩家的同情和青睐,从而在游戏世界里获得更多的利益;有的是为了好玩,过一把在现实生活中无法体会到的异性瘾;有的则是纯粹注册错误;如许等等,诸如此类……而对于我们来说,这都是游戏上帝创造的游戏之作,一种游戏人间的态度。
而当面对游戏世界越来越多的性营销战略,面对游戏厂商为了拉动更多的人到游戏世界里面来消费,换取更多的利益时,人妖或许就是抵制这种性营销策略的最佳终极武器,也是组织网游淫媒化的第一防线。
诸如劲舞团等等标榜一夜情最高的网游,诸如总是以这门那门来吸引眼球但万变不离其宗其实不过就是用男女玩家的性事来刺激别有用心或青春期蠢蠢欲动的玩家去游戏的那些游戏,诸如那些动不动就是用暴露无比只差漏点仅次于三级片的图片和视频作为其招揽生意的海报的游戏厂商,人妖的恶搞行为就是一种有效的抵制。或许抱有种种目的的玩家在这种性营销策略中成为了某个游戏的俘虏,但如果人妖横行在游戏之中,呵呵,毫无疑问,他(她)获得艳遇的“中奖”几率也就小了许多,而他(她)获得“恶心”的机会也就搞了好多个百分点,一旦在游戏中男女的性别和现实中的性别出现了大面积混乱,那么我们就真正实现了你不知道和你聊天的是公是母,也就无从实践游戏厂商在宣传中描述的那些非正常性爱的可能性,当然游戏性营销战略也就失去了宣传效用。
游戏毕竟是游戏,它只是给我们提供娱乐,我们是在玩游戏,而不是被游戏玩。而用“性”来影响玩家的选择,却忽视了游戏的内容和乐趣,无疑将使得游戏的未来发展方向朝着“淫媒”的路上越行越远。我们必须感叹于造物主的神奇,因为有了人妖,或许就能在某种程度上阻止游戏“淫媒化”的趋势,从这种意义上来说,人妖无疑是游戏世界里最可爱的人。当然要真正让游戏回归正常道路,去“淫媒化”,光有人妖还不行,还需要游戏厂商自己看到只有真正好的游戏才能抓住玩家的心,光靠做淫媒绝对不是长远之路,或许,希望他们能看到。(文/张书乐)
二 : 欧美网游简史第一章MUD:创造世界的巫师
原载《大众软件》1月中,转载注明出处自从有了游戏之后,人们不满足于做屏幕前的操控者,而是梦想着自己能够进入到游戏的绚丽世界中,在剑与魔法的世界中拯救世界,称为吟游诗人歌颂的屠龙勇者,或者在武侠世界中快意恩仇,体验江湖恩怨儿女情长。网络游戏的出现让这个梦想渐渐变为可以触摸的东西,直至成为现实。

如果要追溯网络游戏的历史,我们要将目光投向20世纪70年代。早在1969年,美国人瑞克•布罗米(RickBlomme)便以《太空大战》(SpaceWar)为蓝本在PLATO远程教学系统上开发了可以支持两人远程连线的同名游戏,这被认为是网络游戏的鼻祖。而进入70年代之后,计算机领域的2个技术开始发展起来,并且都对游戏行业产生了深远的影响。
1个是电脑游戏,使用简单的计算机图形和处理器构建的1种娱乐体验新形式。不过当时的电脑游戏大都是学生或学者在大学里利用大型计算机开发,传播和影响极其有限。其后随着计算机图形和硬件技术的发展,电脑游戏也随之进步并普及,成为游戏领域的重要分支。
另外1个则是计算机网络技术的产生。通过这一技术可以让不同电脑前的的玩家进入同1个游戏世界,实现虚拟世界的互动。尽管在随后很长一段时间里网络技术对游戏的想象都十分有限,但是到了九十年代末期之后却以燎原之势影响了整个产业的发展。
这两项技术结合便诞生了网络游戏。在西方,《网络创世纪》、《无尽的任务》、《魔兽世界》以及《第二人生》等网络游戏改变了整个产业,也影响了无数的玩家。而在东方的韩国和中国等地,《天堂》、《传奇》、《梦幻西游》、《征途》等游戏开辟了更多新的游戏与商业模式,让网络游戏成为上千万玩家的休闲娱乐之选。
但是最近几年来,无论国内还是国外,网络游戏的开发似乎都走进了1个迷宫,已经很久没有看见在创意上让人一亮的作品了,大量的游戏开发商都在借鉴与模仿成功的作品,至多在其基础上做些细节的调整与优化,然后美其名曰微创新。市场上大量的游戏与多年前的作品相比,有的知识画面质量上的提升和内容的改变,而在游戏模式上几乎没有任何创新之处。
何谓创新?在游戏开发的黄金十年里,毫无疑问的是多种游戏类型和模式的引入,但是在今天游戏类型与模式已经极大丰富极大发展的情况下,革命性的创新又是很困难的一件事。随着多年的开发与运营,网络游戏的开发商也越来越意识到网络游戏更多的是提供服务给玩家的,因此一些优秀的网络游戏所做的只是做好细节上的完善与体验上的优化便足以成功了。但是如果没有类型和模式上的创新,网络游戏今后的发展也是一件枯燥无比的事情。
未来将会怎样?我们不得而知。但是我们可以将目光投向过去,投向那些缔造标准与规则的经典网游们,探寻他们是在怎样的环境下制造出来的,以及给整个产业带来了怎样的影响与启示。
第一章 MUD:创造世界的巫师
你站在1个十字路口,你的面前有2个方向。左[www.61k.com]边的道路十分平坦,但是通往目的地的路程可能会很长,而右边则是条蜿蜒曲折的小路,也许是条捷径。
你选择了右边的道路,这条路看起来是条捷径,但是遍布着荆棘,前方也有很多未知的风险。
道路旁的草丛中跳出了三只恶狼,它们向你展开了攻击。
你死了。
要复活重新开始吗?
Y/N?
————————————信息————————————
游戏:MUD1
开发:Roy Trubshaw、Richard Bartle
引擎:MUDDL
时间: 1978
————————————故事————————————
1977年,罗伊•特鲁布肖(RoyTrubshaw)成为了英国埃塞克斯大学的一名学生,学习计算机科学。如同今天的很多大学生一样,特鲁布肖也开始沉迷于游戏,只是那个时代的游戏与今天有着很大的不同。

1979年的Roy Trubshaw
此时世界上第1款真正意义的电子游戏《太空侵略者》还未问世,校园里流行的是龙与地下城类的桌面游戏以及由此衍生的电脑上的文字角色扮演游戏,特鲁布肖沉迷的正是其中1款地城题材的文字角色扮演游戏《地下城(Dungeons)》——1款模仿当年风靡一时的《魔域帝国(Zork)》的游戏。
顾名思意,《地下城》是1款颇受“龙与地下城(Dungeons andDragons)的影响,以打怪和收集战利品为主要内容的奇幻冒险游戏。游戏的战斗、探索、解谜等部分都由简单的文字指令操控,玩家需要打字来控制行动——唯一的问题是,有的时候电脑并不能识别玩家的文字指令。
沉迷一段时间之后,特鲁布肖脑海中产生了1个想法:如果能够与其他地方的朋友一起在Dungeon的世界中探险会更加有趣。不过在当时联机模式仅限于局域网,特鲁布肖这个看似简单的想法在技术实现上完全是1个噩梦:你没办法让两个人到一台计算机上操作,只能让他们在自己的计算机上进入游戏,并且每台电脑前的玩家看到的游戏世界与数据必须同步。好在70年代末的英国大学生已经对网络的概念有所了解,而埃塞克斯大学有自己的内部网络,可以连接校园内的任何一台计算机,这让特鲁布肖有机会实现自己的突发奇想。

MUD1的设计草图
在经过一段时间的研究后,特鲁布肖发现了1个DEC-10主机的共享内存机制,这也意味着同一程序的两名使用者可以彼此沟通,这让自己的想法变得大为可行。最终特鲁布肖在Dungeon的代码上写了1个框架,实现了自己让多用户联网玩Dungeon的构想,也开创了MUD这一重要的游戏类型。
特鲁布肖所开发的MUD1(为区别这款游戏与MUD这一游戏类型,后文游戏名统一为MUD1)依然是1个纯文字的世界,没有任何图片,但是不同计算机前的玩家可以在游戏里共同冒险、交流。与以往具有网络联机功能的游戏相比,MUD1是第1款真正意义上的实时多人交互的网络游戏,它最大的特色是能够保证整个虚拟世界和玩家角色的持续发展——无论是玩家退出后重新登录还是服务器重启,游戏中的场景、宝箱、怪物和谜题仍保持不变,玩家的角色也依然是上次的状态。

MUD1设计草图
不过这种改变也使游戏的内容需要更加丰富才能满足多用户玩家的需求。特鲁布肖最开始设计的MUD1版本只有一个区域,用户登录后除了和其他用户聊天外,人机交互功能十分有限,因此需要为游戏注入更多的内容才能让游戏更有乐趣。尽管特鲁布肖对于编程十分在行,但对游戏策划则全无经验,这时他的朋友理查德•巴图(RichardBartle)出于兴趣帮他完成了这项工作:增加了更多的区域、怪物、宝物以及谜题等。后来,二人还为游戏开发了一套专用语言——“MUDDL”,并对游戏不断进行修补和维护。

开发MUD1时期的Richard Bartle
巴图的改进和完善工作提高了MUD1的趣味性,意义十分重大。1978年10月20日,二人合作改善后的MUD1在埃塞克斯大学的校园网络内推出,玩家数便很快超出了特鲁布肖和巴图的预期,成为大学里最受欢迎的游戏之一。在危机四伏的丛林冒险、与怪物战斗、解决远古的谜题都成为一些学生业余时间最喜欢的消遣。与早期网络游戏相比只支持有限的玩家相比,MUD1在理论上支持无限多的玩家,但是在现实中由于系统的内存限制等问题使得游戏很快达到支持人数的上限,好在当时只有埃塞克斯大学网络内的人能够访问——直到1980年埃塞克斯大学加入了ARPAnet(AdvanceResearch Projects AgencyNetwork,美国国防部高级研究计划署研制的世界上首个包交换网络,它的成功直接促成了互联网以及传输控制协议即TCP/IP的诞生)。
加入了ARPAnet后,校园以外的玩家也可以通过互联网体验MUD了,来自校园网络之外的玩家大幅增加,占据了大量系统资源,埃塞克斯大学不得不限制用户的登录时间,只允许在教学和科研时间以外的晚间访问以减少负荷,但这并未影响这款游戏在新生的互联网络上的流行。不久特鲁布肖毕业离开学校,留校任教的巴图接手了全部的维护工作,直到1987年MUD1被授权给了CompuServe做商业化运营,巴图决定离开母校全心投入MUD游戏的开发,埃塞克斯大学的MUD服务器也随之关闭,但CompuServe公司运营的MUD则持续了20多年。

Richard Bartle和Roy Trubshaw
在大学期间,巴图出于分享和交流的目的曾将MUD的源代码上传到网络供学者和开发者研究,这一做法的直接后果是在短时间内诞生了一系列的衍生和克隆作品。尽管这对MUD的版权伤害很大,但在另一方面也加速了在线文字角色扮演游戏这1类型的流行。由于MUD是的这类这类作品的起源,所以这类作品也都被称为MUD。在2005年的GDC游戏开发者大会上,组委会授予理查德•巴图游戏先锋奖,以表彰这位网络游戏行业的先驱所做出的贡献。
除了在创作和传播MUD上所做出的贡献之外,巴图最大的贡献是在对游戏玩家行为的研究上。在运营MUD期间,巴图发现游戏中的玩家需求和表现各不相同,在对玩家行为进行分析之后形成了一套自己的理论,后世将其理论称为巴图模型。1996年,巴图发表了一篇名为《红心、梅花、方块、黑桃:MUD游戏玩家分类》的文章,在文章中提出了MUD玩家的4种分类方法,将MUD游戏玩家分为杀手型、成就型、社交型、探索性4种不同的类型,不仅对分析网络游戏玩家的社会学行为建立了指导理论,也对后来的网络游戏开发者产生了巨大的影响。

MUD1的地图
对后世的网络游戏来讲,MUD最大的贡献是让多人在线交互成为了可能,也让游戏制作者们创建1个虚拟游戏世界的梦想变成了可能。同时,MUD也为后世的网络游戏提供了1个模板,很长一段时间之内美眉ORPG都未能跳出其中。关于这一点巴图有着更多的感悟。
“举个例子,我们在MUD1引入级别系统只是当时面临的几种方案的1个选择,但是成为网络游戏的标杆配置之后,人们在开发1款游戏之前想到的是‘我们的游戏应该有多少级’,而不是‘我们是否需要等级这一设定’。在人们的心目中,1个虚拟的游戏世界必须有等级才有意义,这同时也意味着游戏要有1个尽头或顶点。”
对于包括等级系统在内等日益僵化的游戏模式,巴图在很多场合都给予了批评,并希望开发者们能够有所革命。在早年做过商业化的MUD开发之后,巴图目前已经远离游戏开发,重新回到母校从事计算机游戏设计的教学工作。

中文MUD
“罗伊和我当年的工作就像是种下一棵树,树木长大之后撒下更多新的种子,现在已经长成了一片森林。无论我现在做什么事情,这些树木都继续生长下去,虽然今天我也可以继续种树,但是对我来讲尽自己的努力保持森林的健康成长更有意义。”
最后,当我们的目光回到1978年的埃塞克斯大学校园时,不禁会想为人类创造了1个伟大的虚拟世界的两名少年究竟有着怎么样的初衷呢?对于这个问题二人在后来的时光中曾经做过回答,2个人的答案并不相同:当年19岁的特鲁布肖希望使用技术建设1个比现实更出色的世界,而只有18岁的巴图则希望建立1个世界让人们找到自我。
“我的兴趣是创建世界,而不是生活在别人创建的世界里。我希望游戏世界能让人们能跳出现实世界的局限,去尝试新的身份...不是要脱胎换骨,而是让他们找到自己真正的归属”。
————————————启示:文字与画面————————————
在网络游戏发展初期,因为网络自身条件限制,经历了长期的MUD时代,文本冒险游戏占据了近二十年的主流,形成的很不同类型的分支都对今后的网络游戏的发展产生了深远的影响,为网络游戏奠定了坚实的基础。
与后世的图形网络游戏相比,MUD最大的区别就在于只是文字冒险,而没有画面带来的直观感受,这也是在图形网络游戏开始普及之后MUD便迅速湮没在历史的尘埃中的主要原因。游戏首先是1种娱乐,MUD虽然能够提供比书本阅读更愉快的互动体验,但是当人们能够身临其境地在游戏世界中徜徉时,这种仅仅依靠文字想象带来的乐趣便相形逊色了。诚然,文字能够带来想象的空间,但是画面能够带来更直观的观感,大众玩家似乎并不需要太多想象的空间。
三 : 信息图形化:第一印象
信息图形化:第一印象
作者白宁超
2015年10月13日23:23:13
摘要:程序员眼中的统计学系列是作者和团队共同学习笔记的整理。[www.61k.com]首先提到统计学,很多人认为是经济学或者数学的专利,与计算机并没有交集。诚然在传统学科中,其在以上学科发挥作用很大。然而随着科学技术的发展和机器智能的普及,统计学在机器智能中的作用越来越重要。本系列统计学的学习基于《深入浅出统计学》一书(偏向代码实现,需要读者有一定基础,可以参见后面PPT学习)。正如(吴军)先生在《数学之美》一书中阐述的,基于统计和数学模型对机器智能发挥重大的作用。诸如:语音识别、词性分析、机器翻译等世界级的难题也是从统计中找到开启成功之门钥匙的。尤其是在自然语言处理方面更显得重要,因此,对统计和数学建模的学习是尤为重要的。最后感谢团队所有人的参与。(本文原创,转载注明出处:信息图形化:第一印象 )
目录
【程序员眼中的统计学(1)】信息图形化:第一印象
【程序员眼中的统计学(2)】集中趋势度量:分散性、变异性、强大的距
【程序员眼中的统计学(3)】概率计算:把握机会
【程序员眼中的统计学(4)】离散概率分布的运用:善用期望
【程序员眼中的统计学(5)】排列组合:排序、排位、排
【程序员眼中的统计学(6)】几何分布、二项分布及泊松分布:坚持离散
【程序员眼中的统计学(7)】正态分布的运用:正态之美
【程序员眼中的统计学(8)】统计抽样的运用:抽取样本
【程序员眼中的统计学(9)】总体和样本的估计:进行预测
【程序员眼中的统计学(10)】假设检验的运用:研究证据
【程序员眼中的统计学(11)】卡方分布的应用
【程序员眼中的统计学(12)】相关与回归:我的线条如何?
0 引言
在大学时期我打了三年的暑假工,我的工作就是检测数码产品的屏幕的油墨厚度,每天都有好几万的数据报表,面对着这大量的待处理数据,我们就利用了图表来进行统计。
1 饼图算法描述
1.1 饼图算法基本描述
在介绍饼图之前我们先来看一张表格:
上图是表示某公司在下半年中每月的利润情况。
就这张表格而言,我们只能知道各个月份的利润,却无法知道每个月份占总利润的比例,根据这张表格我们画出了两张图,如下:
我们从图中很容易可以得到两个信息:第一幅图看起来数据相差不大,第二幅图看起来数据相差非常大,对于同一张表所画出的两张图为什么会有两种截然不同的见解呢?
其实会发生上述不同的观点主要是因为这两张图的纵轴和标度不一样,第一张图纵轴的起点是0,标度是0.5,而第二张图的纵轴的起点是2.0,标度是0.1。那么什么是标度呢?
标度:标度是指图形纵轴上每段的大小。
数据:不添加任何修饰成分的原始事实与数字,比如说:对、错;1、2、3 。
信息:是指加入了某种修饰成分的数据,比如说:这个答案是对的;这个小孩3岁 。
前面的准备工作做完了,那么我们现在来看看什么叫饼图吧。
饼图为圆形,被分割为几个扇形块,每一块代表一个组(类),扇形块的大小表示这类数据占总体的比例即频数。
频数:一个特定组中的对象数目称为频数。
饼图将整个数据计划分为几个互不相干的组。这意味着,如果把每个扇形块的频数加起来,结果应为100%。
请根据饼图的定义将下面这张表格转化为饼图:
下面总结饼图的优缺点及应用场景:
优点:在进行比例比较的时候,可以一眼看出哪个组具有较高的频数。
缺点:当每种类型的比例大小相差不大时,我们很难根据扇形块的大小来比较频数的高低。
应用场景:根据扇形的优缺点我们可以知道,扇形只能适用于比例相差较大的情况下频数的比较。
该算法是在给定一些数据集的情况下绘制出符合该数据集的饼图。
- 定义:饼图是将圆形分割为几个扇形块,每一块代表一个组(类),扇形块的大小表示这类数据占总体的比例。
- 符号解释:无。
- 具体计算方法:该算法是利用JFreeChart里的jar包里的类和方法来绘制饼图的。
1.2算法的应用场景
在需要绘制饼图的时候使用该算法。
1.3算法的优缺点
- 优点是可以很快速的建立一个饼图;
- 缺点是无法直接从饼图中看出各部分所占的比例。
1.4算法的输入输出(Java代码实现)
输入:
* @param Panel_Pictuer's name string 表示面板名称 My Pie Chart * @param Pie_Pictuer's name string 表示图形名称 Pie Chart * @param x_name string 表示各类名称 One Two Three Four Five Six ## * @param y_size double 表示各类的频数 23 34 25 31 30 28 0
java代码实现:
package pictuer; import java.awt.Dimension; import java.awt.font.TextAttribute; import java.text.AttributedCharacterIterator; import java.text.AttributedString; import java.util.ArrayList; import java.util.List; import java.util.Scanner; import javax.swing.JPanel; import org.jfree.chart.*; import org.jfree.chart.labels.PieSectionLabelGenerator; import org.jfree.chart.plot.PiePlot; import org.jfree.data.general.DefaultPieDataset; import org.jfree.data.general.PieDataset; import org.jfree.ui.ApplicationFrame; import org.jfree.ui.RefineryUtilities; public class PieChartDemo8 extends ApplicationFrame { /** * 设置饼图各小块的个数 * @return 饼图各小块的个数 * @author bnc * */ static class CustomLabelGenerator implements PieSectionLabelGenerator { public String generateSectionLabel(PieDataset piedataset, Comparable comparable) { String s = null; if (piedataset != null && !comparable.equals("Two")) s = comparable.toString(); return s; } /** * @return 返回装载图片的图形构造 */ public AttributedString generateAttributedSectionLabel(PieDataset piedataset, Comparable comparable) { AttributedString attributedstring = null; String s = comparable.toString(); String s1 = (new StringBuilder()).append(s).append(" : ").append(String.valueOf(piedataset.getValue(comparable))).toString(); attributedstring = new AttributedString(s1); attributedstring.addAttribute(TextAttribute.WEIGHT, TextAttribute.WEIGHT_BOLD, 0, s.length() - 1); return attributedstring; } CustomLabelGenerator() { } } /* * 构造函数,创建面板用来存放图片 * @parame s 表示面板的名称 */ public PieChartDemo8(String s) { super(s); JPanel jpanel = createDemoPanel();//jpanel 创建面板的名称 jpanel.setPreferredSize(new Dimension(500, 270)); setContentPane(jpanel); } /** * 获得绘制饼图所需的数据 * @return 绘制饼图所需的数据集 */ private static PieDataset createDataset() { DefaultPieDataset defaultpiedataset = new DefaultPieDataset();//defaultpiedataset 装载饼图所需数据的数据集 List<String> list_name=new ArrayList<String>();//list_name 装载直方图各小块区间的容器 list_name.add("One"); list_name.add("Two"); list_name.add("Three"); list_name.add("Four"); list_name.add("Five"); int n=5; List<String> li_name=list_name;//li_name 存放饼图各小块名称的容器 List<Double> list_size=new ArrayList<Double>();//list_size 装载条形图各小块频数的容器 list_size.add(23.0); list_size.add(13.0); list_size.add(25.0); list_size.add(12.0); list_size.add(18.0); List<Double> li_size=list_size;//li_size 存放饼图各小块频数的容器 for(int i=0;i<n;i++){ defaultpiedataset.setValue(li_name.get(i),new Double(li_size.get(i)));//存放数据 } return defaultpiedataset; } /** * 创建饼图 * @return 返回饼图 */ private static JFreeChart createChart(PieDataset piedataset,String Pie_Name) { JFreeChart jfreechart = ChartFactory.createPieChart(Pie_Name, piedataset, false, true, false);//jfreechart 图形变量,用来装载图形 PiePlot pieplot = (PiePlot)jfreechart.getPlot(); pieplot.setLabelGenerator(new CustomLabelGenerator()); return jfreechart; } /** * 创建饼图面板 * @return 返回饼图面板 */ public static JPanel createDemoPanel() { String Pie_name; Pie_name="My Chart"; JFreeChart jfreechart = createChart(createDataset(),Pie_name);//jfreechart 图形变量,通过图形数据和图形名称创建图形 return new ChartPanel(jfreechart); } public static void main(String args[]) { /** * 绘制饼图 * @author cuit * @return 返回饼图 */ String Panel_name; Panel_name="My Chart"; PieChartDemo8 piechartdemo8 = new PieChartDemo8(Panel_name);//piechartdemo8 构造方法实例变量 piechartdemo8.pack(); RefineryUtilities.centerFrameOnScreen(piechartdemo8); piechartdemo8.setVisible(true); } }扩展:程序员眼中的产品经理 / 别人眼中的程序员 / 程序员眼中的世界
输出结果:
1.5 导致算法异常
当y_size输入的个数大于x_name的个数会导致异常,系统会自动的将y_size多余的数值剔除掉
1.6 代码的算法参考
类源码:见源程序:Panel. src. All_Pictuer. PieChartDemo8
本算法是通过输入绘制饼图的数据集来绘制出饼图的具体实现。
类和方法调用接口
见源程序:Panel. src. All_Pictuer. PieChartDemo8
PieChartDemo8.java 下包含如下方法:
getN_name() //得到饼图各小块的个数
setN_name(int n_name) //设置饼图各小块的个数
Input_Name() //输入饼图各小块的名称
Input_Size() //输入饼图各小块的频数
generateAttributedSectionLabel(PieDataset piedataset, Comparable comparable) //装载图片的图形构造
PieChartDemo8(String s) //构造函数,创建面板用来存放图片
createDataset() //获得绘制饼图所需的数据
createChart(PieDataset piedataset,String Pie_Name) //创建饼图
createDemoPanel() //创建饼图面板
2 条形图算法描述
2.1 条形图算法基本描述
条形图
通过前面我们知道了饼图的基本特征,那么请看看下面这张饼图有什么问题吧。
这个饼图的问题就在于很难一眼看出哪一类玩家的满意度最高。用于扇形块所占整体比例无关的百分数来标识饼图通常也会让人犯晕,例如,“体育”块标示着99%,但这一块在饼图中所占的比例仅为20%左右。另一个问题是,我们不知道每种游戏的反馈数目是否相等,因此也无法知道用这种方式对满意度进行比较是否公正。
饼图的作用是对不同组(或者类)所占的比例进行比较,但在这个例子中,各个组的比例相差无几,这就是饼图失效的地方,那么究竟什么图可以完成这种情况呢?那么我们就得引入条形图了。
条形图:条形图是用一个一个间隔的长方形来表示的,每一个长方形代表一个特定的类,长方形的长度代表某种数值。长方形越长,数值越大,所有长方形的宽都是相等的。
垂直条形图
条形图分为垂直条形图和水平条形图两种,下面我们就来看看垂直条形图的具体画法:
水平条形图
同样是将上面的表格转换成水平条形图(水平条形图跟垂直条形图相比,只是坐标轴调换了一下而已)
在一般情况下,我们经常用垂直条形图,但在类名称太长的时候,水平条形图就有用了----你将有大量空白位置标示每个类的名称,不用横七竖八的进行摆布。
百分度标度:类的数目的大小是用百分数来表示的。
在使用百分度标度时,一定要设法指出频数-----或是将频数标在图形中间,或是标在图形旁边。
频数标度:类的数目的大小是用数字而非百分数表示的。
在使用频数标度时,一定要小心纵轴的起点,通常纵轴的起点是从0开始,不过当使用不以0为起点的纵轴可以让数据给人不同的第一印象。
堆积条形图
堆积条形图:将同一种类的不同的属性分别用两个相连的的长方形在一张条形图
下面总结堆积条形图的优缺点及应用场景: 优点:党比表同一种类的不同属性的频数的时候很简单明了。
缺点:很难看出某个类的比例和属性的比例。
应用场景:同一个类有多个属性而我们只需比较不同属性之间的频数
分段条形图
分段条形图:将同一种类的不同的属性分段在一个长方形上展示
下面总结分段条形图的优缺点及应用场景:
优点:可以很清晰的看出每个类的总和和各个属性的比例。
缺点:不容易看出各个属性的频数。
应用场景:同一个类有多个属性而我们需要比较各个类的比较或不同属性之间的比例。
该算法是在给定一些数据集的情况下绘制出符合该数据集的条形图。
- 定义:条形图是用一个一个间隔的长方形来表示的,每一个长方形代表一个特定的类,长方形的长度代表某种数值。
- 符号解释:无。
- 具体计算方法:该算法是利用JFreeChart里的jar包里的类和方法来绘制条形图的。
扩展:程序员眼中的产品经理 / 别人眼中的程序员 / 程序员眼中的世界
2.2算法的应用场景
在需要绘制条形图的时候使用该算法。
2.3算法的优缺点
- 优点是可以很快速的建立一个条形图;
- 缺点是所输入的各小块的名称时必须得转化成Year类型。
2.4算法的输入输出
输入量:
* @param Panel's name string 表示面板名称 My Chart
* @param Pictuer's name string 表示图形名称 Chart
* @param x_name double 表示各类名称 1 2 3 4 5 6 0
* @param y_size double 表示各类的频数 23 34 25 31 30 28 0
java代码实现:
package pictuer; import java.awt.Dimension; import java.awt.Font; import java.io.PrintStream; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.List; import java.util.Scanner; import javax.swing.JPanel; import org.jfree.chart.*; import org.jfree.chart.axis.DateAxis; import org.jfree.chart.axis.DateTickMarkPosition; import org.jfree.chart.labels.StandardXYToolTipGenerator; import org.jfree.chart.plot.PlotOrientation; import org.jfree.chart.plot.XYPlot; import org.jfree.chart.renderer.xy.XYBarRenderer; import org.jfree.chart.title.TextTitle; import org.jfree.data.time.*; import org.jfree.data.xy.IntervalXYDataset; import org.jfree.ui.ApplicationFrame; import org.jfree.ui.RefineryUtilities; public class XYBarChartDemo1 extends ApplicationFrame { /** * 构造函数,用来创建面板用来存放图片 * @param s 表示面板的名称 */ public XYBarChartDemo1(String s) { super(s); JPanel jpanel = createDemoPanel();//jpanel 创建面板的名称 jpanel.setPreferredSize(new Dimension(500, 270)); setContentPane(jpanel); } /** * 创建条形图 * @param intervalxydataset 数周数据生成变量,用来存放数轴数据 * @return 返回条形图 */ private static JFreeChart createChart(IntervalXYDataset intervalxydataset,String Pictuer_name) { //System.out.println("请输入该图片的名称(类型是String):"); //Scanner input = new Scanner(System.in);//input 输入流变量,存放从键盘输入的字符串 //String Pictuer_name=input.nextLine();//Pictuer_name 字符串变量,用来存放条形图的名称 JFreeChart jfreechart = ChartFactory.createXYBarChart(Pictuer_name, "Year", true, "Number of People", intervalxydataset, PlotOrientation.VERTICAL, true, false, false); //jfreechart 图形变量,用来装载图形 XYPlot xyplot = (XYPlot)jfreechart.getPlot();//xyplot 数轴变量,用来存放和设置数轴的信息 XYBarRenderer xybarrenderer = (XYBarRenderer)xyplot.getRenderer();//xybarrenderer 图形方块变量 StandardXYToolTipGenerator standardxytooltipgenerator = new StandardXYToolTipGenerator("{1} = {2}", new SimpleDateFormat("yyyy"), new DecimalFormat("0")); //standardxytooltipgenerator 数周数据生成变量,用来存放数轴数据 xybarrenderer.setBaseToolTipGenerator(standardxytooltipgenerator); xybarrenderer.setMargin(0.10000000000000001D); DateAxis dateaxis = (DateAxis)xyplot.getDomainAxis();//dateaxis 数值变量,用来设置数轴的数值的 dateaxis.setTickMarkPosition(DateTickMarkPosition.MIDDLE); dateaxis.setLowerMargin(0.01D); dateaxis.setUpperMargin(0.01D); ChartUtilities.applyCurrentTheme(jfreechart); return jfreechart; } /** * 获得绘制条形图所需的数据 * @return 绘制条形图所需的数据集 */ private static IntervalXYDataset createDataset() { List<Integer> list_name=new ArrayList<Integer>();//list_name 装载直方图各小块区间的容器 list_name.add(1); list_name.add(2); list_name.add(3); list_name.add(4); list_name.add(5); int n=5; TimeSeries timeseries = new TimeSeries("Executions", "Year", "Count");//timeseries 时间变量,存放数据时间的 List<Integer> li_name=list_name;//li_name 存放条形图各小块区间的容器 List<Double> list_size=new ArrayList<Double>();//list_size 装载条形图各小块频数的容器 list_size.add(23.0); list_size.add(13.0); list_size.add(25.0); list_size.add(12.0); list_size.add(18.0); List<Double> li_size=list_size;//li_size 存放条形图各区间频数的容器 for(int i=0;i<n;i++){ try { timeseries.add(new Year(li_name.get(i)), new Double(li_size.get(i))); } catch (Exception exception) { System.err.println(exception.getMessage()); }//抛异常 } TimeSeriesCollection timeseriescollection = new TimeSeriesCollection(timeseries);//timeseriescollection 时间数集变量 return timeseriescollection; } /** * 得到条形图各小块的个数 * @return 直方图各小块的个数 */ /** * 设置条形图各小块的个数 * @return 直方图各小块的个数 */ /** * 创建条形图面板 * @param ChartPanel 图形面板变量 * @return 返回直方图面板 */ public static JPanel createDemoPanel() { String Pictuer_name; Pictuer_name="Chart"; return new ChartPanel(createChart(createDataset(),Pictuer_name)); } public static void main(String args[]) { /** * 绘制条形图 * @author cuit * @return 返回直方图 */ String panel_name; panel_name="My Chart"; XYBarChartDemo1 xybarchartdemo1 = new XYBarChartDemo1(panel_name);//xybarchartdemo1 构造方法实例变量 xybarchartdemo1.pack(); RefineryUtilities.centerFrameOnScreen(xybarchartdemo1); xybarchartdemo1.setVisible(true); } }扩展:程序员眼中的产品经理 / 别人眼中的程序员 / 程序员眼中的世界
输出:
2.5导致算法异常
当y_size输入的个数大于x_name的个数会导致异常,系统会自动的将y_size多余的数值剔除掉
2.6代码的算法参考
类源码:见源程序:Panel. src. All_Pictuer. XYBarChartDemo1
本算法是通过输入绘制条形图的数据集来绘制出饼图的具体实现。
类和方法调用接口
见源程序:Panel. src. All_Pictuer. XYBarChartDemo1
XYBarChartDemo1.java 下包含如下方法:
getN_name() //得到条形图各小块的个数
setN_name(int n_name) //设置条形图各小块的个数
Input_Name() //输入条形图各小块的名称
Input_Size() //输入条形图各小块的频数
XYBarChartDemo1(String s) //构造函数,创建面板用来存放图片
createDataset() //获得绘制条形图所需的数据
createChart(IntervalXYDataset intervalxydataset) //创建条形图
createDemoPanel() //创建条形图面板
3 直方图算法描述
3.1 直方图算法基本描述
该算法是在给定一些数据集的情况下绘制出符合该数据集的直方图。
- 定义:直方图是用一个一个连续的长方形来表示的,每一个长方形代表一个特定的类,长方形的长度代表某种数值。
- 符号解释:无。
- 具体计算方法:该算法是利用JFreeChart里的jar包里的类和方法来绘制直方图的。
3.2算法的应用场景
在需要绘制直方图的时候使用该算法。
3.3算法的优缺点
- 优点是可以很快速的建立一个直方图
- 缺点是无法自由设置纵轴的标度。
3.4算法的输入输出
输入:
* @param panel's name string 表示面板名称 My Chart
* @param histograme's name string 表示图形名称 Chart
* @param x's name string 表示x轴的名称 My X
* @param x_QuJian double 表示各类名称 1 2 3 4 5 6 0
* @param y_size double 表示各类的频数 23 34 25 31 30 28 0
java代码实现:
package pictuer; import java.awt.Dimension; import java.util.ArrayList; import java.util.List; import java.util.Scanner; import javax.swing.JPanel; import org.jfree.chart.*; import org.jfree.chart.axis.NumberAxis; import org.jfree.chart.plot.PlotOrientation; import org.jfree.chart.plot.XYPlot; import org.jfree.chart.renderer.xy.XYBarRenderer; import org.jfree.data.statistics.SimpleHistogramBin; import org.jfree.data.statistics.SimpleHistogramDataset; import org.jfree.data.xy.IntervalXYDataset; import org.jfree.ui.ApplicationFrame; import org.jfree.ui.RefineryUtilities; public class HistogramDemo2 extends ApplicationFrame { /** * 构造函数,用来创建面板用来存放图片 * @param s 表示面板的名称 */ public HistogramDemo2(String s) { super(s); JPanel jpanel = createDemoPanel();//jpanel 创建面板的名称 jpanel.setPreferredSize(new Dimension(500, 270)); setContentPane(jpanel); } /** * 得到直方图各小块的个数 * @return 直方图各小块的个数 */ /** * 获得绘制直方图所需的数据 * @return 绘制饼图所需的数据集 */ private static IntervalXYDataset createDataset() { String x_name; x_name="X_Name"; SimpleHistogramDataset simplehistogramdataset = new SimpleHistogramDataset(x_name);//simplehistogramdataset 装载直方图所需数据的数据集 List<Double> list_size=new ArrayList<Double>();//list_size 装载条形图各小块频数的容器 list_size.add(9.0); list_size.add(10.0); list_size.add(11.0); list_size.add(12.0); list_size.add(13.0); int n=5; List<Double> l_qujian=list_size;//l_qujian 存放直方图各小块区间的容器 List<Integer> list_name=new ArrayList<Integer>();//list_name 装载直方图各小块区间的容器 list_name.add(23); list_name.add(12); list_name.add(56); list_name.add(32); list_name.add(22); List<Integer> l_size=list_name;//l_size 存放直方图各区间频数的容器 for(int i=0;i<n-1;i++){ SimpleHistogramBin simplehistogrambin = new SimpleHistogramBin(l_qujian.get(i),l_qujian.get(i+1), true, false);//simplehistogrambin 图形变量 simplehistogrambin.setItemCount(l_size.get(i)); simplehistogramdataset.addBin(simplehistogrambin); } return simplehistogramdataset; } /** * 创建直方图 * @param intervalxydataset 装载直方图所需数据的数据集 * @return 返回直方图 */ private static JFreeChart createChart(IntervalXYDataset intervalxydataset) { String h_name; h_name="Y_Name"; JFreeChart jfreechart = ChartFactory.createHistogram(h_name, null, null, intervalxydataset, PlotOrientation.VERTICAL, true, true, false); //jfreechart 图形变量,用来装载图形 XYPlot xyplot = (XYPlot)jfreechart.getPlot();//xyplot 数轴变量,用来存放和设置数轴的信息 xyplot.setForegroundAlpha(0.85F); xyplot.setDomainPannable(true); xyplot.setRangePannable(true); NumberAxis numberaxis = (NumberAxis)xyplot.getRangeAxis();//numberaxis 数值变量,用来设置数轴的数值的 numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits()); XYBarRenderer xybarrenderer = (XYBarRenderer)xyplot.getRenderer();//xybarrenderer 图形方块变量 xybarrenderer.setDrawBarOutline(false); return jfreechart; } /** * 创建直方图面板 * @return 返回直方图面板 */ public static JPanel createDemoPanel() { JFreeChart jfreechart = createChart(createDataset());//jfreechart 图形变量,通过图形数据和图形名称创建图形 ChartPanel chartpanel = new ChartPanel(jfreechart);//chartpanel 图形面板变量 chartpanel.setMouseWheelEnabled(true); return chartpanel; } public static void main(String args[]) { /** * 绘制直方图 * @author cuit * @return 返回直方图 */ String panel_name; panel_name="My Chart"; HistogramDemo2 histogramdemo2 = new HistogramDemo2(panel_name);//histogramdemo2 构造方法实例变量 histogramdemo2.pack(); RefineryUtilities.centerFrameOnScreen(histogramdemo2); histogramdemo2.setVisible(true); } }扩展:程序员眼中的产品经理 / 别人眼中的程序员 / 程序员眼中的世界
输出:
3.5导致算法异常
当y_size输入的个数大于x_QuJian的个数会导致异常,系统会自动的将y_size多余的数值剔除掉。
3.6代码的算法参考
类源码:见源程序:Panel. src. All_Pictuer. HistogramDemo2
本算法是通过输入绘制直方图的数据集来绘制出饼图的具体实现。
类和方法调用接口
见源程序:Panel. src. All_Pictuer. HistogramDemo2
HistogramDemo2.java 下包含如下方法:
getN_qujian() //得到直方图各小块的个数
setN_qujian(int n_qujian) //设置直方图各小块的个数
Input_QuJian() //输入直方图各小块的区间
Input_Size() //输入直方图各小块的频数
HistogramDemo2(String s) //构造函数,创建面板用来存放图片
createDataset() //获得绘制直方图所需的数据
createChart(IntervalXYDataset intervalxydataset) //创建直方图
createDemoPanel() //创建直方图面板
4 折线图算法描述
4.1 折线图算法基本描述
当我们在处理存在负增长的数据时我们就不能用累计频数图了,因为累计频数图永远都是增长的,那么这个时候我们就该用到折线图了。
折线图:用来体现数据型数据的发展趋势的。
那么我们现在来看一下根据下面的这张表转换成折线图的画法吧。
该算法是在给定一些数据集的情况下绘制出符合该数据集的折线图。
- 定义:折线图用来体现数据型数据的发展趋势的。
- 符号解释:无。
- 具体计算方法:该算法是利用JFreeChart里的jar包里的类和方法来绘制折线图的。
4.2算法的应用场景
在需要绘制折线图的时候使用该算法。
4.3算法的优缺点
- 优点是可以很快速的建立一个折线图
- 缺点是所输入的各小块的名称时必须得转化成Year类型。
4.4算法的输入输出
输入:
* @param Panel's name string 表示面板名称 My Chart
* @param Classes's name string 表示类名称 Chart
* @param pictuer's name string 表示图形名称 Pictuer Chart
* @param y's name string 表示y轴的名称 Chart Y
* @param x's name string 表示x轴的名称 My X
* @param x_name string 表示各类名称 1 2 3 4 5 6 ##
* @param y_size double 表示各类的频数 23 34 25 31 30 28 0
java代码实现:
package pictuer; import java.awt.*; import java.awt.geom.Ellipse2D; import java.net.URL; import java.util.ArrayList; import java.util.List; import java.util.Scanner; import javax.swing.ImageIcon; import javax.swing.JPanel; import org.jfree.chart.*; import org.jfree.chart.axis.NumberAxis; import org.jfree.chart.plot.CategoryPlot; import org.jfree.chart.plot.PlotOrientation; import org.jfree.chart.renderer.category.LineAndShapeRenderer; import org.jfree.chart.title.TextTitle; import org.jfree.data.category.CategoryDataset; import org.jfree.data.category.DefaultCategoryDataset; import org.jfree.ui.*; public class LineChartDemo1 extends ApplicationFrame { /** * 构造函数,用来创建面板用来存放图片 * @param s 表示面板的名称 */ public LineChartDemo1(String s) { super(s); JPanel jpanel = createDemoPanel();//jpanel 创建面板的名称 jpanel.setPreferredSize(new Dimension(500, 270)); setContentPane(jpanel); } /** * 获得绘制折线图所需的数据 * @return 绘制饼图所需的数据集 */ private static CategoryDataset createDataset() { DefaultCategoryDataset defaultcategorydataset = new DefaultCategoryDataset();//defaultcategorydataset 装载折线图所需数据的数据集 List<String> list_name=new ArrayList<String>();//list_name 装载直方图各小块区间的容器 list_name.add("One"); list_name.add("Two"); list_name.add("Three"); list_name.add("Four"); list_name.add("Five"); int n=5; List<String> li_name=list_name;//li_name 存放折线图各点的容器 List<Double> list_size=new ArrayList<Double>();//list_size 装载条形图各小块频数的容器 list_size.add(23.0); list_size.add(13.0); list_size.add(25.0); list_size.add(12.0); list_size.add(18.0); List<Double> li_size=list_size;//li_size 存放折线图各点频数的容器 String Classess_name; Classess_name="Class"; for(int i=0;i<n;i++){ defaultcategorydataset.addValue(new Double(li_size.get(i)),Classess_name,li_name.get(i));//存放数据 } return defaultcategorydataset; } /** * 创建折线图 * @param categorydataset 装载折线图所需数据的数据集 * @return 返回直方图 */ private static JFreeChart createChart(CategoryDataset categorydataset) { String Pictuer_name; Pictuer_name="My Chart"; String y_name; y_name="Chart"; JFreeChart jfreechart = ChartFactory.createLineChart(Pictuer_name, null,y_name, categorydataset, PlotOrientation.VERTICAL, false, true, false); //jfreechart 图形变量,用来装载图形 CategoryPlot categoryplot = (CategoryPlot)jfreechart.getPlot();//categoryplot 数轴变量,用来存放和设置数轴的信息 categoryplot.setRangePannable(true); categoryplot.setRangeGridlinesVisible(false); NumberAxis numberaxis = (NumberAxis)categoryplot.getRangeAxis();//numberaxis 数值变量,用来设置数轴的数值的 numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits()); ChartUtilities.applyCurrentTheme(jfreechart); LineAndShapeRenderer lineandshaperenderer = (LineAndShapeRenderer)categoryplot.getRenderer();//lineandshaperenderer 图形方块变量 lineandshaperenderer.setBaseShapesVisible(true); lineandshaperenderer.setDrawOutlines(true); lineandshaperenderer.setUseFillPaint(true); lineandshaperenderer.setBaseFillPaint(Color.white); lineandshaperenderer.setSeriesStroke(0, new BasicStroke(3F)); lineandshaperenderer.setSeriesOutlineStroke(0, new BasicStroke(2.0F)); lineandshaperenderer.setSeriesShape(0, new java.awt.geom.Ellipse2D.Double(-5D, -5D, 10D, 10D)); return jfreechart; } /** * 创建折线图面板 * @return 返回折线图面板 */ public static JPanel createDemoPanel() { JFreeChart jfreechart = createChart(createDataset());//jfreechart 图形变量,通过图形数据和图形名称创建图形 ChartPanel chartpanel = new ChartPanel(jfreechart);//chartpanel 图形面板变量 chartpanel.setMouseWheelEnabled(true); return chartpanel; } public static void main(String args[]) { /** * 绘制折线图 * @author cuit * @return 返回直方图 */ String Panel_name; Panel_name="Chart"; LineChartDemo1 linechartdemo1 = new LineChartDemo1(Panel_name);//linechartdemo1 构造方法实例变量 linechartdemo1.pack(); RefineryUtilities.centerFrameOnScreen(linechartdemo1); linechartdemo1.setVisible(true); } }扩展:程序员眼中的产品经理 / 别人眼中的程序员 / 程序员眼中的世界
输出:
4.5导致算法异常
当y_size输入的个数大于x_name的个数会导致异常,系统会自动的将y_size多余的数值剔除掉
4.6代码的算法参考
类源码:见源程序:Panel. src. All_Pictuer. LineChartDemo1
本算法是通过输入绘制折线图的数据集来绘制出饼图的具体实现。
类和方法调用接口
见源程序:Panel. src. All_Pictuer. LineChartDemo1
LineChartDemo1.java 下包含如下方法:
getN_name() //得到折线图点的个数
setN_name(int n_name) //设置直折线图点的个数
Input_Name() //输入折线图各点的区间
Input_Size() //输入折线图各点的频数
LineChartDemo1(String s) //构造函数,创建面板用来存放图片
createDataset() //获得绘制折线图所需的数据
createChart(CategoryDataset categorydataset) //创建折线图
createDemoPanel() //创建折线图面板
5 箱线图算法描述
5.1 箱线图算法基本描述
该算法是在给定一些数据集的情况下绘制出符合该数据集的箱线图。
- 定义:箱线图是用来显示数据的全距、四分位距以及中位数的图形。
- 符号解释:无。
- 具体计算方法:该算法是利用JFreeChart里的jar包里的类和方法来绘制箱线图的。
5.2算法的应用场景
在需要绘制箱线图的时候使用该算法。
5.3算法的优缺点
优点是可以很快速的建立一个箱线图。
5.4算法的输入输出
输入:
* @param panel's name string 表示面板名称 My Chart
* @param x's name string 表示x轴名称 My X
* @param y's name string 表示y轴名称 My Y
* @param the max double 表示最大值 1
* @param the min double 表示最小值 33
* @param the under_four double 表示下四分位数 10
* @param the over_four double 表示上四分位数 15
* @param Pictuer's name string 表示图片名称 Chart
java代码实现:
package pictuer; import java.awt.Dimension; import java.util.ArrayList; import java.util.List; import java.util.Scanner; import javax.swing.JPanel; import org.jfree.chart.*; import org.jfree.chart.axis.NumberAxis; import org.jfree.chart.plot.PlotOrientation; import org.jfree.chart.plot.XYPlot; import org.jfree.chart.renderer.xy.XYBarRenderer; import org.jfree.data.statistics.SimpleHistogramBin; import org.jfree.data.statistics.SimpleHistogramDataset; import org.jfree.data.xy.IntervalXYDataset; import org.jfree.ui.ApplicationFrame; import org.jfree.ui.RefineryUtilities; public class HistogramDemo2 extends ApplicationFrame { /** * 构造函数,用来创建面板用来存放图片 * @param s 表示面板的名称 */ public HistogramDemo2(String s) { super(s); JPanel jpanel = createDemoPanel();//jpanel 创建面板的名称 jpanel.setPreferredSize(new Dimension(500, 270)); setContentPane(jpanel); } /** * 得到直方图各小块的个数 * @return 直方图各小块的个数 */ /** * 获得绘制直方图所需的数据 * @return 绘制饼图所需的数据集 */ private static IntervalXYDataset createDataset() { String x_name; x_name="X_Name"; SimpleHistogramDataset simplehistogramdataset = new SimpleHistogramDataset(x_name);//simplehistogramdataset 装载直方图所需数据的数据集 List<Double> list_size=new ArrayList<Double>();//list_size 装载条形图各小块频数的容器 list_size.add(9.0); list_size.add(10.0); list_size.add(11.0); list_size.add(12.0); list_size.add(13.0); int n=5; List<Double> l_qujian=list_size;//l_qujian 存放直方图各小块区间的容器 List<Integer> list_name=new ArrayList<Integer>();//list_name 装载直方图各小块区间的容器 list_name.add(23); list_name.add(12); list_name.add(56); list_name.add(32); list_name.add(22); List<Integer> l_size=list_name;//l_size 存放直方图各区间频数的容器 for(int i=0;i<n-1;i++){ SimpleHistogramBin simplehistogrambin = new SimpleHistogramBin(l_qujian.get(i),l_qujian.get(i+1), true, false);//simplehistogrambin 图形变量 simplehistogrambin.setItemCount(l_size.get(i)); simplehistogramdataset.addBin(simplehistogrambin); } return simplehistogramdataset; } /** * 创建直方图 * @param intervalxydataset 装载直方图所需数据的数据集 * @return 返回直方图 */ private static JFreeChart createChart(IntervalXYDataset intervalxydataset) { String h_name; h_name="Y_Name"; JFreeChart jfreechart = ChartFactory.createHistogram(h_name, null, null, intervalxydataset, PlotOrientation.VERTICAL, true, true, false); //jfreechart 图形变量,用来装载图形 XYPlot xyplot = (XYPlot)jfreechart.getPlot();//xyplot 数轴变量,用来存放和设置数轴的信息 xyplot.setForegroundAlpha(0.85F); xyplot.setDomainPannable(true); xyplot.setRangePannable(true); NumberAxis numberaxis = (NumberAxis)xyplot.getRangeAxis();//numberaxis 数值变量,用来设置数轴的数值的 numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits()); XYBarRenderer xybarrenderer = (XYBarRenderer)xyplot.getRenderer();//xybarrenderer 图形方块变量 xybarrenderer.setDrawBarOutline(false); return jfreechart; } /** * 创建直方图面板 * @return 返回直方图面板 */ public static JPanel createDemoPanel() { JFreeChart jfreechart = createChart(createDataset());//jfreechart 图形变量,通过图形数据和图形名称创建图形 ChartPanel chartpanel = new ChartPanel(jfreechart);//chartpanel 图形面板变量 chartpanel.setMouseWheelEnabled(true); return chartpanel; } public static void main(String args[]) { /** * 绘制直方图 * @author cuit * @return 返回直方图 */ String panel_name; panel_name="My Chart"; HistogramDemo2 histogramdemo2 = new HistogramDemo2(panel_name);//histogramdemo2 构造方法实例变量 histogramdemo2.pack(); RefineryUtilities.centerFrameOnScreen(histogramdemo2); histogramdemo2.setVisible(true); } }扩展:程序员眼中的产品经理 / 别人眼中的程序员 / 程序员眼中的世界
输出:
5.5导致算法异常
当所输入的上四分位数比下四分位数大或者最小值比最大值大的时候画出的图形将不再是箱线图了。
5.6代码的算法参考
类源码:见源程序:Panel. src. All_Pictuer. BoxAndWhiskerChartDemo2
本算法是通过输入绘制箱线图的数据集来绘制出饼图的具体实现。
类和方法调用接口
见源程序:Panel. src. All_Pictuer. BoxAndWhiskerChartDemo2
BoxAndWhiskerChartDemo2.java 下包含如下方法:
BoxAndWhiskerChartDemo2(String s) //构造函数,创建面板用来存放图片
createDataset() //获得绘制箱线图所需的数据
createChart(BoxAndWhiskerXYDataset boxandwhiskerxydataset) //创建箱线图
createDemoPanel() //创建箱线图面板
6 正态分布图算法描述
6.1 正态分布图算法基本描述
该算法是在给定一些数据集的情况下绘制出符合该数据集的正态分布图。
- 定义:正态分布具有钟型曲线,曲线对称,中央部位的概率密度最大。
- 符号解释:无。
- 具体计算方法:该算法是利用JFreeChart里的jar包里的类和方法来绘制正态分布图的。
6.2算法的应用场景
在需要绘制正态分布图的时候使用该算法。
6.3算法的优缺点
- 优点是可以很快速的建立一个正态分布图
- 缺点是无法直接读出方差。
6.4算法的输入输出
输入:
* @param Pie's name string 表示面板名称 My Chart
* @param u double 表示均值 2
* @param squal_t double 表示方差 0.25
* @param Line's name string 表示线条名称 Chart
* @param Pictuer's name string 表示图片名称 Pictuer Chart
java代码实现:
package pictuer; import java.awt.Dimension; import java.util.Scanner; import javax.swing.JPanel; import org.jfree.chart.*; import org.jfree.chart.plot.PlotOrientation; import org.jfree.data.function.NormalDistributionFunction2D; import org.jfree.data.general.DatasetUtilities; import org.jfree.data.xy.XYDataset; import org.jfree.ui.ApplicationFrame; import org.jfree.ui.RefineryUtilities; public class NormalDistributionDemo1 extends ApplicationFrame { /** * 构造函数,用来创建面板用来存放图片 * @param s 表示面板的名称 */ public NormalDistributionDemo1(String s) { super(s); JPanel jpanel = createDemoPanel();//jpanel 创建面板的名称 jpanel.setPreferredSize(new Dimension(500, 270)); setContentPane(jpanel); } /** * 创建正态分布图面板 * @return 返回正态分布图面板 */ public static JPanel createDemoPanel() { JFreeChart jfreechart = createChart(createDataset());//jfreechart 图形变量,通过图形数据和图形名称创建图形 return new ChartPanel(jfreechart);//ChartPanel 图形面板变量 } /** * 获得绘制正态分布图所需的数据 * @return 返回正态分布图所需的数据 */ public static XYDataset createDataset() { Double u=2.0; Double squal_t=0.25; NormalDistributionFunction2D normaldistributionfunction2d = new NormalDistributionFunction2D(u, squal_t); //normaldistributionfunction2d 数据变量,用来存放数轴的数据 String Line_name; Line_name="Chart"; XYDataset xydataset = DatasetUtilities.sampleFunction2D(normaldistributionfunction2d, -5D, 5D, 100, Line_name); //xydataset 数据变量,用来存放和设置数轴的数据 return xydataset; } /** * 创建正态分布图 * @param xydataset 数据变量,用来存放和设置数轴的数据 * @return 返回正态分布图 */ public static JFreeChart createChart(XYDataset xydataset) { String Pictuer_name; Pictuer_name="Chart"; JFreeChart jfreechart = ChartFactory.createXYLineChart(Pictuer_name, "X", "Y", xydataset, PlotOrientation.VERTICAL, true, true, false); //jfreechart 图形变量,用来装载图形 return jfreechart; } public static void main(String args[]) { /** * 绘制正态分布图 * @author cuit * @return 返回正态分布图 */ String Pie_name; Pie_name="My Chart"; NormalDistributionDemo1 normaldistributiondemo1 = new NormalDistributionDemo1(Pie_name); //normaldistributiondemo1 构造方法实例变量 normaldistributiondemo1.pack(); RefineryUtilities.centerFrameOnScreen(normaldistributiondemo1); normaldistributiondemo1.setVisible(true); } }
输出:
6.5导致算法异常
无。
6.6代码的算法参考 扩展:程序员眼中的产品经理 / 别人眼中的程序员 / 程序员眼中的世界
类源码:见源程序:Panel. src. All_Pictuer. NormalDistributionDemo1
本算法是通过输入正态分布图的数据集来绘制出饼图的具体实现。
类和方法调用接口
见源程序:Panel. src. All_Pictuer. NormalDistributionDemo1
NormalDistributionDemo1.java 下包含如下方法:
NormalDistributionDemo1(String s) //构造函数,创建面板用来存放图片
createDataset() //获得绘制正态分布图所需的数据
createChart(XYDataset xydataset) //创建正态分布图
createDemoPanel() //创建正态分布图面板
7 本章总结
7.1 基本概念
7.2 各种图形优缺点
8 开源共享
PPT:http://yunpan.cn/cFJWt8MBFduhX 访问密码 ad2e
开源代码:http://yunpan.cn/cFJW5EazGX5mz 访问密码 9304
扩展:程序员眼中的产品经理 / 别人眼中的程序员 / 程序员眼中的世界