当前位置:   article > 正文

可视化数据分析-基于JavaScript的d3实践学习_d3 javascript

d3 javascript

目录

一.svg简介

二.D3简介

D3功能来源

常用语法说明

三.d3可视化访问MySQL数据库

实现方法

四.具体用例实现

svg绘制直方图

svg绘制二叉树(以电影票房为例)

D3进行数据可视化(链接数据库)

D3绘制直方图

D3绘制饼图

D3绘制力导向图

D3绘制词云图



 

一.svg简介

SVG是什么

可缩放矢量图形(Scalable Vector Graphics)是基于可扩展标记语言(Extensible Markup Language,XML ),用于描述二维矢量图形的一种图形格式,一般用在网页。

SVG创建工具

由于SVG是XML文件,SVG图像可以用任何文本编辑器创建,但它往往是与一个绘图程序一起使用,如Inkscape、Adobe Illustrator,更方便地创建SVG图像。

SVG使用方式

1. 浏览器直接打开

2. 在HTML中使用<img>标签引用

3. 直接在HTML中使用SVG标签

4. 作为CSS背景

SVG优点

1. 矢量的图形,不会失真任意伸缩。

2. 可被非常多的工具读取和修改(比如记事本)。

3. 与 JPEG 和 GIF 图像比起来,尺寸更小,且可压缩性更强。

4. 图像中的文本是可选的,同时也是可搜索的(很适合制作地图)。

浏览器支持

IE9+,Firefox,Chrome,Opera和Safar、iOS、Android3+ 都支持SVG。

 

二.D3简介

  D3.js 是一个基于数据的操作文档的 JavaScript 库,可以绑定任何数据到 ,支持 DIV 图案生成,也支持 SVG 图案的生成,D3提供了各种简单易用的函数,大大简化JS操作数据的难度,尤其在数据可视化方面,D3已将生成可视化的复杂步骤精简到了几个简单函数,只需输入几个简单数据,就可将数据转换绘制为各种基本图形。在操作过程中可以简单这样来解释:有一个存在若干个结点的选择区域,其中有若干个结点可以容纳数据,其结点和数据一一对应,在操作过程中实际上时将数据存放在节点中,这一过程称为绑定数据。

D3功能来源

直接引用d3.v3.js或其他d3版本文档。

常用语法说明

d3.select("body")
选择器:D3采用了一种声明式的方法,对任意节点集合的操作被称为选择。例如:

1

d3.select('#vis').append('div').style('top', '20px').style('left','20px');

selectAll("p")
选择DOM中的所有段落。由于没有存在,这将返回一个空的选择。这个选择为空,代表段落很快就会存在。

data(dataset)
计数和分析我们的数据值。如果dataset中有五个值,则之后我们的数据集将会执行5次,每个值一次。

enter()
要创建新的数据绑定的元素,需要使用enter() 。这个方法会在DOM中,然后被传递给它的数据。如果有更多的数据值比相应的DOM元素,然后进入() 创建一个新的占位符元素,关闭的引用到这个新的占位符链中的下一个步骤。

append("p")
以占位符enter() 到DOM中插入一个p元素。

text("New paragraph!")
将新创建的p和插入一个文本值的参考。

function(){return ;}

动态属性:D3 支持这种以 function 方式传入的属性,这样的属性是动态的,每次执行的时候再去调用计算获得:

1

2

3

d3.selectAll("p").style("color", function() {

  return "hsl(" + Math.random() * 360 + ",100%,50%)";

});

三.d3可视化访问MySQL数据库

实现方法

在html页面中嵌入Java代码,在tomcat的lib目录中引入mysql-connector-java-5.1.6-bin.jar包,编写Java代码取出数据库中相关数据,再在d3中进行可视化操作。

四.具体用例实现

 

svg绘制直方图

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <meta name="viewport" content="width=device-width">
  6. <title>直方图</title>
  7. </head>
  8. <body>
  9. <svg id="mySVG" width="800" height="600" version="1.1"></svg>
  10. <script type="text/javascript">
  11. var mysvg = document.getElementById("mySVG");
  12. var rec= new Array();
  13. var txt=new Array();
  14. for(var i=0;i<6;i++){
  15. rec[i] = document.createElement("rect");
  16. txt[i] = document.createElement("text");
  17. mysvg.appendChild(rec[i]);
  18. mysvg.appendChild(txt[i]);
  19. var h=Math.random()*255;
  20. var r=Math.floor(Math.random()*255);
  21. var g=Math.floor(Math.random()*255);
  22. var b=Math.floor(Math.random()*255);
  23. rec[i].outerHTML="<rect x="+(45*i)+" y="+(400-h)+" width=42 height="+h+" style='fill:rgb("+r+","+g+","+b+")'/>";
  24. txt[i].outerHTML="<text x="+(10+45*i)+" y="+(400-h)+">"+Math.floor(h)+"</text>";
  25. }
  26. </script>
  27. </body>
  28. </html>

 

svg绘制二叉树(以电影票房为例)

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>树形二叉树</title>
  6. </head>
  7. <body>
  8. <h1 align="center" fontsize=7>电影总票房排序文字二叉树-计科鲁俊丽-201811113010</h1>
  9. <svg id="svg01" width=800 height=600>
  10. </svg>
  11. <script>
  12. var w = window.innerWidth
  13. || document.documentElement.clientWidth
  14. || document.body.clientWidth;
  15. var h = window.innerHeight
  16. || document.documentElement.clientHeight
  17. || document.body.clientHeight;
  18. w=w*0.98;
  19. h=h*0.9;
  20. var svg=document.getElementById("svg01");
  21. svg.setAttribute("width",w);
  22. svg.setAttribute("height",h);
  23. var x0=w/2;
  24. var y0=h;
  25. var rate=0.4*(0.5+Math.random()*0.5);
  26. var a=-Math.PI/2;
  27. var count=6;
  28. var str=["战狼2","哪吒之魔童降世","流浪地球","复仇者联盟4","终局之战","红海行动","美人鱼","唐人街探案2","我和我的祖国","我不是药神","中国机长","速度与激情8","西虹市首富","速度与激情7","捉妖记","复仇者联盟3:无限战争","捉妖记2","羞羞的铁拳","疯狂的外星人","海王","变形金刚4:绝迹重生","前任3:再见前任","毒液:致命守护者","功夫瑜伽","飞驰人生","侏罗纪世界2","寻龙诀","烈火英雄","西游伏妖篇","港囧", "变形金刚5:最后的骑士","少年的你","疯狂动物城","魔兽","复仇者联盟2:奥创纪元","夏洛特烦恼","速度与激情:特别行动","芳华","侏罗纪世界","蜘蛛侠:英雄远征","头号玩家","后来的我们","一出好戏","阿凡达","摔跤吧!爸爸","扫毒2天地对决","人再囧途之泰囧","无双","西游降魔篇","美国队长3:英雄内战","碟中谍6:全面瓦解","寻梦环游记 ","西游记之孙悟空三打白骨精","误杀","加勒比海盗5:死无对证","长城","湄公河行动","叶问4","心花路放金刚:骷髅岛煎饼侠","大黄蜂","极限特工:终极回归","澳门风云3","生化危机6:终章","攀登者","变形金刚3","西游记之大闹天宫","巨齿鲨","乘风破浪","神偷奶爸3","惊奇队长","盗墓笔记","功夫熊猫3","狂暴巨兽","奇幻森林","澳门风云2","西游记之大圣归来","泰坦尼克号3D版","比悲伤更悲伤的故事 ","哥斯拉2:怪兽之王","老炮儿","超时空同居","绝地逃亡","阿丽塔:战斗天使","智取威虎山3D","十二生肖","智取威虎山","碟中谍5:神秘国度","银河补习班","冰雪奇缘2","星球大战:原力觉醒","蚁人2:黄蜂女现身","狮子王","从你的全世界路过","唐人街探案","叶问3","X战警:天启","反贪风暴4","无名之辈","北京遇上西雅图之不二情书,钢铁侠3","蜘蛛侠:英雄归来","霍比特人3:去而复归","大闹天竺","星际穿越","奇异博士","无问西东","天将雄师","神秘巨星","雷神3:诸神黄昏","猩球崛起:终极之战","金刚狼3:殊死一战","X战警:逆转未来","终结者:创世纪","美国队长2","西游记女儿国 ","致我们终将逝去的青春","私人订制","猩球崛起2:黎明之战","熊出没·原始时代","画皮II","狼图腾","爸爸去哪儿","使徒行者2:谍影行动","铁道飞虎","环太平洋","悟空传","银河护卫队2","正义联盟 ","鬼吹灯之九层妖塔","寒战2 宠爱","碟中谍4:幽灵协议","唐山大地震","蚁人","分手大师","摩天营救","让子弹飞","情圣","黑豹"];
  29. var sign=["1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1"];
  30. function show(x0,y0,rate,a,count)
  31. {
  32. //var L=L*rate*(Math.random()*0.5+0.5);
  33. var aL=a-Math.PI/4*(Math.random()*0.5+0.5);
  34. var aR=a+Math.PI/4*(Math.random()*0.5+0.5);
  35. var stri=str[0];
  36. for(var i=Math.pow(2,6-count)-1;i<Math.pow(2,7-count)-1;i++)
  37. {
  38. if(sign[i]=="1")
  39. {
  40. stri=str[i];
  41. sign[i]="0";
  42. i=Math.pow(2,7-count)-1;
  43. }
  44. };
  45. var fontsize=count*6;
  46. var L=stri.length*fontsize;
  47. var x1=x0;
  48. var y1=y0;
  49. var x2=x1+L*Math.cos(a);
  50. var y2=y1+L*Math.sin(a);
  51. var words=document.createElement("text");
  52. svg.appendChild(words);
  53. words.outerHTML="<text x="+x1+" y="+y1+" transform='rotate("+(a*180)/Math.PI+","+x1+","+y1+")' fill='steelblue' font-size="+fontsize+">"+stri+"</text>"
  54. if(count>0)
  55. {
  56. show(x2,y2,rate,aL,count-1);
  57. show(x2,y2,rate,aR,count-1);
  58. if(count==1)
  59. {
  60. var apple=document.createElement("circle");
  61. svg.appendChild(apple);
  62. apple.outerHTML="<circle cx="+x2+" cy="+y2+" r=4 fill='red'/>"
  63. }
  64. }
  65. }
  66. show(x0,y0,rate,a,count);
  67. </script>
  68. </body>
  69. </html>

D3进行数据可视化(链接数据库)

D3绘制直方图

  1. <html>
  2. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  3. <head>
  4. <meta charset="utf-8">
  5. </head>
  6. <body charset="utf-8">
  7. <div id="wc"></div>
  8. <%@ page contentType="text/html; charset=gb2312" %>
  9. <%@ page language="java" %>
  10. <%@ page import="com.mysql.jdbc.Driver" %>
  11. <%@ page import="java.sql.*" %>
  12. <%
  13. out.print("<center><h1><font color=steelblue>2021年影视剧全平台播放量统计直方图-5月24日数据</h1></center>");
  14. out.print("<center><h2><font color=steelblue>来源:骨朵数据</h2></center>");
  15. //驱动程序名
  16. String driverName="com.mysql.jdbc.Driver";
  17. //数据库用户名
  18. String userName="root";
  19. //密码
  20. String userPasswd="password";
  21. //数据库名
  22. String dbName="engword";
  23. //表名
  24. String tableName="episoderank";
  25. String tableName1="nodeluxun";
  26. String tableName2="edgesluxun";
  27. //联结字符串
  28. Class.forName("com.mysql.jdbc.Driver").newInstance();
  29. Connection connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/engword?useUnicode=true&characterEncoding=utf8&useSSL=false","root","password");
  30. Statement statement = connection.createStatement();
  31. float charcount[]=new float[40];
  32. String occu[]=new String[40];
  33. for(int i=1;i<41;i++){
  34. String sql="SELECT * FROM "+tableName+" where id = '"+i+"'";
  35. String str=" ";
  36. float per=1;
  37. ResultSet rs = statement.executeQuery(sql);
  38. while(rs.next())
  39. {
  40. str=rs.getString(2);
  41. per=rs.getFloat(3);
  42. // out.print(per);
  43. //out.print(str);
  44. }
  45. charcount[i-1]=per;
  46. occu[i-1]=str;
  47. rs.close();
  48. }
  49. String name[]=new String[20];
  50. String image[]=new String[20];
  51. String intro[]=new String[20];
  52. int source[]=new int[20];
  53. int target[]=new int[20];
  54. String relation[]=new String[20];
  55. for(int i=1;i<21;i++){
  56. String sql="SELECT * FROM "+tableName1+" where id = '"+i+"'";
  57. String str=" ";
  58. String str1=" ";
  59. String str2=" ";
  60. ResultSet rs = statement.executeQuery(sql);
  61. while(rs.next())
  62. {
  63. str=rs.getString(2);
  64. str1=rs.getString(3);
  65. str2=rs.getString(4);
  66. }
  67. name[i-1]=str;
  68. image[i-1]=str1;
  69. intro[i-1]=str2;
  70. rs.close();
  71. }
  72. for(int i=1;i<21;i++){
  73. String sql1="SELECT * FROM "+tableName2+" where id = '"+i+"'";
  74. int nums=0;
  75. int numt=0;
  76. String str2=" ";
  77. ResultSet rs = statement.executeQuery(sql1);
  78. while(rs.next())
  79. {
  80. nums=rs.getInt(2);
  81. numt=rs.getInt(3);
  82. str2=rs.getString(4);
  83. }
  84. source[i-1]=nums;
  85. target[i-1]=numt;
  86. relation[i-1]=str2;
  87. rs.close();
  88. }
  89. statement.close();
  90. connection.close();
  91. %>
  92. <script src="d3.v4.js"></script>
  93. <script src="d3.layout.cloud.js"></script>
  94. <script>
  95. var color = d3.scaleOrdinal(d3.schemeCategory10);
  96. var w=window.innerWidth;
  97. var h=window.innerHeight;
  98. w=w;
  99. h=h*2.5;
  100. /*-----------------------------------------------直方图------------------------------------------------------*/
  101. //var color=d3.scale.category10();
  102. var dataset=new Array(14);
  103. //var dataAlphabet=new Array(14);
  104. var occupation=new Array(14);
  105. <%
  106. for (int i=0;i<14;i++){
  107. %>
  108. //dataset[i]=Math.floor(Math.random()*500);
  109. dataset[<%=i%>]=<%=charcount[i]%>; //js的代码
  110. occupation[<%=i%>]='<%=occu[i]%>';
  111. <% }%>
  112. var ww=w/dataset.length;
  113. var svg=d3.select("body")
  114. .append("svg")
  115. .attr("width",w)
  116. .attr("height",h);
  117. var rect=svg.selectAll("rect")
  118. .data(dataset)
  119. .enter()
  120. .append("rect")
  121. .attr("x",function(d,i){return 120+i*w*0.85/dataset.length})
  122. .attr("y",function(d){return 0.4*h-d*10})
  123. .attr("width",ww*0.7)
  124. .attr("height",function(d){return d*10})
  125. .attr("fill",function(d,i){return "steelblue"});
  126. var rect=svg.selectAll("text")
  127. .data(dataset)
  128. .enter()
  129. .append("text")
  130. .attr("x",function(d,i){return 100+i*w*0.85/dataset.length})
  131. .attr("y",function(d){return 0.4*h-10*d+8})
  132. .text(function(d){return d+"亿"})
  133. .attr("dx",ww/2)
  134. .attr("dy","-1em")
  135. .attr("text-anchor","middle")
  136. .attr("font-size",15)
  137. .attr("fill",'black');
  138. var rectA=svg.selectAll("text1")
  139. .data(occupation)
  140. .enter()
  141. .append("text")
  142. .attr("x",function(d,i){return 100+i*w*0.85/occupation.length})
  143. .attr("y",function(d){return 0.4*h+23})
  144. .attr("font-size",15)
  145. .text(function(d){return d})
  146. .attr("dx",ww/2)
  147. .attr("dy","-1em")
  148. .attr("text-anchor","middle")
  149. .attr("font-size",10)
  150. .attr("fill","black");
  151. </script>
  152. </body>
  153. </html>

D3绘制饼图

  1. <html>
  2. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  3. <body charset="utf-8">
  4. <div id="wc"></div>
  5. <%@ page contentType="text/html; charset=utf-8" %>
  6. <%@ page language="java" %>
  7. <%@ page import="com.mysql.jdbc.Driver" %>
  8. <%@ page import="java.sql.*" %>
  9. <%
  10. out.print("<center><h1><font color=steelblue>2021年影视剧全平台播放量统计-5月24日数据</h1></center>");
  11. out.print("<center><h2><font color=steelblue>来源:骨朵数据</h2></center>");
  12. //驱动程序名
  13. String driverName="com.mysql.jdbc.Driver";
  14. //数据库用户名
  15. String userName="root";
  16. //密码
  17. String userPasswd="password";
  18. //数据库名
  19. String dbName="engword";
  20. //表名
  21. String tableName="episoderank";
  22. Class.forName("com.mysql.jdbc.Driver").newInstance();
  23. Connection connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/engword?useUnicode=true&characterEncoding=utf8&useSSL=false","root","password");
  24. Statement statement = connection.createStatement();
  25. float charcount[]=new float[40];
  26. String occu[]=new String[40];
  27. for(int i=1;i<41;i++){
  28. String sql="SELECT * FROM "+tableName+" where id = '"+i+"'";
  29. String str=" ";
  30. float per=1;
  31. ResultSet rs = statement.executeQuery(sql);
  32. while(rs.next())
  33. {
  34. str=rs.getString(2);
  35. per=rs.getFloat(3);
  36. // out.print(per);
  37. //out.print(str);
  38. }
  39. charcount[i-1]=per;
  40. occu[i-1]=str;
  41. rs.close();
  42. }
  43. statement.close();
  44. connection.close();
  45. %>
  46. <script src="d3.v4.js" charset="utf-8"></script>
  47. <script>
  48. var w=window.innerWidth|| document.documentElement.clientWidth|| document.body.clientWidth;
  49. var h=window.innerHeight|| document.documentElement.clientHeight|| document.body.clientHeight;
  50. var width = w*0.98;
  51. var height =h*0.96;
  52. var dataset=new Array(14);
  53. var total=0;
  54. <%
  55. for (int i=0;i<14;i++){
  56. %>
  57. dataset[<%=i%>]=['<%=occu[i]%>',<%=charcount[i]%>];
  58. // total+=dataset1[<%=i%>][1];
  59. <% }%>
  60. //转化数据为适合生成饼图的对象数组
  61. var pie = d3.pie()
  62. .value(function(d){return d[1];});
  63. innerRadius = 50;//圆环内半径
  64. var arc=d3.arc()//设置弧度的内外半径,等待传入的数据生成弧度
  65. .innerRadius(innerRadius)
  66. .outerRadius(function (d) {
  67. var value=d.value;
  68. return value*5+ innerRadius;
  69. });
  70. var svg=d3.select("body")
  71. .append("svg")
  72. .attr("width",width)
  73. .attr("height",height);
  74. var color = d3.scaleOrdinal(d3.schemeCategory20c);
  75. //准备分组,把每个分组移到图表中心
  76. var arcs=svg.selectAll("g")
  77. .data(pie(dataset))
  78. .enter()
  79. .append("g")
  80. //移到图表中心
  81. .attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");//translate(a,b)a表示横坐标起点,b表示纵坐标起点
  82. //为组中每个元素绘制弧形路路径
  83. arcs.append("path")//每个g元素都追加一个path元素用绑定到这个g的数据d生成路径信息
  84. .attr("fill",function(d,i){//填充颜色
  85. return color(i);
  86. })
  87. .attr("d",arc)//将角度转为弧度(d3使用弧度绘制
  88. .on('mouseover',function(d,i){
  89. d3.select(this)
  90. .attr("fill", d3.rgb(color(i)).brighter());
  91. svg.append("text")
  92. .attr("id","info")
  93. .attr("x",width/2)
  94. .attr("y",height/2)
  95. .attr("text-anchor","middle")
  96. .attr("font-size",20)
  97. .text(d.data[0]);
  98. svg.append("text")
  99. .attr("id","value")
  100. .attr("x",width/2)
  101. .attr("y",height/2+24)
  102. .attr("text-anchor","middle")
  103. .attr("font-size",20)
  104. .text(d.value+"亿");
  105. })
  106. .on('mouseout',function(d,i){
  107. d3.select(this)
  108. .attr("fill",color(i));
  109. d3.select("#info")
  110. .remove();
  111. d3.select("#value")
  112. .remove();
  113. });
  114. arcs.append("text")
  115. .attr("transform",function(d){
  116. var x = arc.centroid(d)[0];
  117. var y = arc.centroid(d)[1];
  118. return "translate(" + x + "," + y + ")";
  119. })
  120. .attr("text-anchor","middle")
  121. .attr("font-size",function(d) {
  122. return d.data[1]*0.8 + "px";
  123. })
  124. .text(function(d){
  125. return d.value;
  126. });
  127. </script>
  128. </body>
  129. </html>

 

D3绘制力导向图

  1. <!DOCTYPE html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  4. <meta meta charset="utf-8">
  5. <h1 align="center"><font color=black > 影视剧觉醒年代人物鲁迅关系图</h1>
  6. <h2 align="right">
  7. 来源:北京鲁迅博物馆
  8. </h2>
  9. <style>
  10. path{
  11. fill: none;
  12. stroke: #666;
  13. stroke-width: 1.5px;
  14. }
  15. circle {
  16. stroke: #333;
  17. stroke-width: 1.5px;
  18. }
  19. text {
  20. font: 10px sans-serif;
  21. pointer-events: none;
  22. }
  23. .tooltip{
  24. position: absolute;
  25. width: 340px;
  26. height: auto;
  27. font-family: simsun;
  28. font-size: 10px;
  29. text-align: left;
  30. color: black;
  31. border-width: 1px solid black;
  32. background-color: 7FFF00;
  33. border-radius: 3px;
  34. }
  35. .tooltip:after{
  36. content: '';
  37. position: absolute;
  38. bottom: 100%;
  39. left: 20%;
  40. margin-left: -3px;
  41. width: 0;
  42. height: 0;
  43. border-bottom: 12px solid black;
  44. border-right: 12px solid transparent;
  45. border-left: 12px solid transparent;
  46. }
  47. </style>
  48. </head>
  49. <body style=" opacity:1">
  50. <div id="wc"></div>
  51. <%@ page contentType="text/html; charset=gb2312" %>
  52. <%@ page language="java" %>
  53. <%@ page import="com.mysql.jdbc.Driver" %>
  54. <%@ page import="java.sql.*" %>
  55. <%
  56. //驱动程序名
  57. String driverName="com.mysql.jdbc.Driver";
  58. //数据库用户名
  59. String userName="root";
  60. //密码
  61. String userPasswd="password";
  62. //数据库名
  63. String dbName="engword";
  64. //表名
  65. //表名
  66. String tableName1="nodeluxun";
  67. String tableName2="edgesluxun";
  68. Class.forName("com.mysql.jdbc.Driver").newInstance();
  69. Connection connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/engword?useUnicode=true&characterEncoding=utf8&useSSL=false","root","password");
  70. Statement statement = connection.createStatement();
  71. //float charcount[]=new float[20];
  72. String name[]=new String[20];
  73. String image[]=new String[20];
  74. String intro[]=new String[20];
  75. int source[]=new int[20];
  76. int target[]=new int[20];
  77. String relation[]=new String[20];
  78. for(int i=1;i<21;i++){
  79. String sql="SELECT * FROM "+tableName1+" where id = '"+i+"'";
  80. String str=" ";
  81. String str1=" ";
  82. String str2=" ";
  83. ResultSet rs = statement.executeQuery(sql);
  84. while(rs.next())
  85. {
  86. str=rs.getString(2);
  87. str1=rs.getString(3);
  88. str2=rs.getString(4);
  89. // out.print(per);
  90. // out.print(str);
  91. }
  92. name[i-1]=str;
  93. image[i-1]=str1;
  94. intro[i-1]=str2;
  95. // out.print(name[i-1]);
  96. rs.close();
  97. }
  98. for(int i=1;i<21;i++){
  99. String sql1="SELECT * FROM "+tableName2+" where id = '"+i+"'";
  100. int nums=0;
  101. int numt=0;
  102. String str2=" ";
  103. ResultSet rs = statement.executeQuery(sql1);
  104. while(rs.next())
  105. {
  106. nums=rs.getInt(2);
  107. numt=rs.getInt(3);
  108. str2=rs.getString(4);
  109. // out.print(str2);
  110. }
  111. source[i-1]=nums;
  112. target[i-1]=numt;
  113. relation[i-1]=str2;
  114. // out.print(name[i-1]);
  115. rs.close();
  116. }
  117. statement.close();
  118. connection.close();
  119. %>
  120. <script src="https://d3js.org/d3.v3.min.js"></script>
  121. <script type="text/javascript">
  122. var width=(window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth)*0.98;
  123. var height=(window.innerHeight||document.documentElement.clientHeight||document.body.clientHeight)*0.9;
  124. var img_h=50;
  125. var img_w=50;
  126. var radius=10;
  127. var svg=d3.select("body")
  128. .append("svg")
  129. .attr("width",width)
  130. .attr("height",height);
  131. var nodes=new Array(20);
  132. <%
  133. for (int i=0;i<20;i++){
  134. %>
  135. nodes[<%=i%>]={name:"<%=name[i]%>",image:"<%=image[i]%>",intro:"<%=intro[i]%>"};
  136. // total+=dataset1[<%=i%>][1];
  137. <% }%>
  138. var edges=new Array(20);
  139. <%
  140. for (int i=0;i<20;i++){
  141. %>
  142. edges[<%=i%>]={source:<%=source[i]%>,target:<%=target[i]%>,relation:"<%=relation[i]%>"};
  143. // total+=dataset1[<%=i%>][1];
  144. <% }%>
  145. var force=d3.layout.force()
  146. .nodes(nodes)
  147. .links(edges)
  148. .size([width,height])
  149. .linkDistance(150)
  150. .charge(-1200)
  151. .start();
  152. //提示框部分
  153. var tooltip=d3.selectAll("body")
  154. .append("div")
  155. .attr("class","tooltip")
  156. .style("opacity",0.0);
  157. //箭头绘制
  158. var defs = svg.append("defs");
  159. var radius=10;
  160. var arrowMarker = defs.append("marker")
  161. .attr("id","arrow")
  162. .attr("markerUnits","strokeWidth")
  163. .attr("markerWidth","4")
  164. .attr("markerHeight","4")
  165. .attr("viewBox","0 0 4 4")
  166. .attr("refX",20+radius/8-2) //实际是radius/strokeWidth
  167. .attr("refY",2)
  168. .attr("orient","auto");
  169. var arrow_path = "M0,1 L4,2 L0,3 L0,0";
  170. arrowMarker.append("path")
  171. .attr("d",arrow_path);
  172. var color=d3.scale.category20();
  173. var path = svg.selectAll("path")
  174. .data(edges)
  175. .enter()
  176. .append("path")
  177. .attr("id", function(d,i) {
  178. return "edgepath" +i;
  179. })
  180. .attr("class","edges")
  181. .attr("marker-end","url(#arrow)");
  182. var pathtext = svg.selectAll('.pathText')
  183. .data(edges)
  184. .enter()
  185. .append("text")
  186. .attr("class","pathText")
  187. .append('textPath')
  188. .attr("text-anchor", "middle")//居中
  189. .attr("startOffset","50%")
  190. .attr('xlink:href', function(d,i) { return "#edgepath" + i; })
  191. .text(function(d) { return d.relation; });
  192. var img_h=50;
  193. var img_w=50;
  194. var radius=23;
  195. var circles=svg.selectAll("forceCircle")
  196. .data(nodes)
  197. .enter()
  198. .append("circle")
  199. .attr("class","forceCircle")
  200. .attr("r",radius)
  201. .style("stroke","DarkGray")
  202. .style("stroke-width","1.0px")
  203. .attr("fill", function(d, i){
  204. //创建圆形图片
  205. var defs = svg.append("defs").attr("id", "imgdefs");
  206. var catpattern = defs.append("pattern")
  207. .attr("id", "catpattern" + i)
  208. .attr("height", 1)
  209. .attr("width", 1);
  210. catpattern.append("image")
  211. .attr("x", - (img_w / 2 - radius+5.8))
  212. .attr("y", - (img_h / 2 - radius+3.5))
  213. .attr("width", img_w+11)
  214. .attr("height", img_h+6)
  215. .attr("xlink:href","image/"+d.image);
  216. return "url(#catpattern" + i + ")";
  217. })
  218. .on("mouseover",function(d,i){ //加入提示框
  219. tooltip.html("角色简介:"+d.intro)
  220. .style("left",(d3.event.pageX)+"px")
  221. .style("top",(d3.event.pageY+20)+"px")
  222. .style("opacity",1.0);
  223. })
  224. .on("mousemove",function(d){
  225. tooltip.style("left",(d3.event.pageX)+"px")
  226. .style("top",(d3.event.pageY+20)+"px"); })
  227. .on("mouseout",function(d){
  228. tooltip.style("opacity",0.0); })
  229. .call(force.drag);
  230. var texts=svg.selectAll(".forceText")
  231. .data(nodes)
  232. .enter()
  233. .append("text")
  234. .attr("class","forceText")
  235. .attr("x",function(d){return d.x;})
  236. .attr("y",function(d){return d.y;})
  237. .style("stroke", "#2F4F4F")
  238. .attr("dx","-1.5em")
  239. .attr("dy","3em")
  240. .text(function(d){return d.name;});
  241. force.on("tick",function(){
  242. path.attr("d", function(d) {
  243. var dx = d.target.x - d.source.x;//增量
  244. var dy = d.target.y - d.source.y;
  245. return "M" + d.source.x + ","+ d.source.y + "L" + d.target.x + "," + d.target.y;
  246. });
  247. circles.attr("cx",function(d){return d.x;});
  248. circles.attr("cy",function(d){return d.y;});
  249. texts.attr("x",function(d){return d.x;});
  250. texts.attr("y",function(d){return d.y;});
  251. });
  252. </script>
  253. </body>

D3绘制词云图

  1. <html>
  2. <meta charset=utf-8>
  3. <body>
  4. <div id="wc"></div>
  5. <%@ page contentType="text/html; charset=utf-8" %>
  6. <%@ page language="java" %>
  7. <%@ page import="com.mysql.jdbc.Driver" %>
  8. <%@ page import="java.sql.*" %>
  9. <%
  10. out.print("<center><h1><font color=steelblue>词云图</h1></center>");
  11. //驱动程序名
  12. String driverName="com.mysql.jdbc.Driver";
  13. //数据库用户名
  14. String userName="root";
  15. //密码
  16. String userPasswd="password";
  17. //数据库名
  18. String dbName="engword";
  19. //表名
  20. String tableName="episoderank";
  21. //联结字符串
  22. Class.forName("com.mysql.jdbc.Driver").newInstance();
  23. Connection connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/engword?useUnicode=true&characterEncoding=utf8&useSSL=false","root","password");
  24. Statement statement = connection.createStatement();
  25. String name[]=new String[100];
  26. float rate[]=new float[100];
  27. // int count[] = new int[26];
  28. for(int i=0;i<45;i++){
  29. //String sql="SELECT * FROM "+tableName+" where english like 'a%' "+"order by english";
  30. String sql="SELECT * FROM "+tableName+" where id = "+(i+1)+" ";
  31. ResultSet rs = statement.executeQuery(sql);
  32. // 输出每一个数据值
  33. float per=0;
  34. String na="";
  35. while(rs.next()) {
  36. per=rs.getFloat(3);
  37. na=rs.getString(2);
  38. }
  39. name[i]=na;
  40. rate[i]=per;
  41. //count[i]=j;
  42. //out.print(" "+j+" <br>");
  43. rs.close();
  44. }
  45. statement.close();
  46. connection.close();
  47. %>
  48. <script src="d3.v4.js" charset="utf-8"></script>
  49. <script src="d3.layout.cloud.js"></script>
  50. <script>
  51. color = d3.scaleOrdinal(d3.schemeCategory10);
  52. var w = window.innerWidth
  53. || document.documentElement.clientWidth
  54. || document.body.clientWidth;
  55. var h = window.innerHeight
  56. || document.documentElement.clientHeight
  57. || document.body.clientHeight;
  58. var width = w * 0.98;
  59. var height = h * 0.9;
  60. var words = new Array(45);
  61. <%
  62. for(int i=0;i<45;i++)
  63. {%>
  64. words[<%=i%>]={name:"<%=name[i]%>",size:<%=rate[i]%>};
  65. <%}
  66. %>
  67. var wc=d3.layout.cloud()
  68. .size([w, h])
  69. .words(words)
  70. .padding(5)
  71. .rotate(function() { return ~~(Math.random() * 2) * 90; })
  72. .font("Impact")
  73. .fontSize(function(d) { return d.size; })
  74. .on("end", draw)
  75. .start();
  76. function draw(words) {
  77. d3.select("body").append("svg")
  78. .attr("width", w)
  79. .attr("height", h)
  80. .append("g")
  81. .attr("transform", "translate(300,200)")
  82. .selectAll("text")
  83. .data(words)
  84. .enter().append("text")
  85. .style("font-size", function(d) { return d.size+"px"; })
  86. .style("font-family", "Impact")
  87. .style("fill",function(d,i){return color(i);})
  88. .attr("text-anchor", "middle")
  89. .attr("transform", function(d) {
  90. return "translate(" + [d.x+w/4, d.y+h/4] + ")rotate(" + d.rotate + ")";
  91. })
  92. .text(function(d) { return d.name; });
  93. }
  94. </script>
  95. </body>
  96. </html>

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/562984
推荐阅读
相关标签
  

闽ICP备14008679号