Created
March 17, 2020 07:23
-
-
Save InJeCTrL/bc562751c5bc63178b03481c3863d1bd to your computer and use it in GitHub Desktop.
一种分层级显示散点图
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?php | |
| error_reporting(E_ALL || ~E_NOTICE); | |
| include "../conn/conn.php"; | |
| if (isset($_REQUEST['lwtype'])) | |
| { | |
| $Herb_ID = $_REQUEST['lwtype']; | |
| } | |
| if (isset($_REQUEST['OB'])) | |
| { | |
| $OB = $_REQUEST['OB']; | |
| } | |
| if (isset($_REQUEST['DL'])) | |
| { | |
| $DL = $_REQUEST['DL']; | |
| } | |
| if (isset($_REQUEST['value'])) | |
| { | |
| $value = $_REQUEST['value']; | |
| } | |
| if (isset($_REQUEST['fre'])) | |
| { | |
| $fre = $_REQUEST['fre']; | |
| } | |
| if (isset($_REQUEST['maxcount'])) | |
| { | |
| $maxcount = (int)($_REQUEST['maxcount']); | |
| } | |
| $ret = []; | |
| $ret["type"] = "force"; | |
| $ret["categories"] = [["name" => "中药材","base" => "中药"], | |
| ["name" => "成分","base" => "成分"], | |
| ["name" => "靶点","base" => "靶点"], | |
| ["name" => "通路","base" => "通路"]]; | |
| $ret["nodes"] = []; | |
| $ret["links"] = []; | |
| // 存储节点的序号 | |
| $arr_node = array(); | |
| // 序号计数器 | |
| $i_node = 0; | |
| $sql = 'select DISTINCT lwname,MOL_Name,Target_Name,Pathway_Name from (((((lunwen LEFT JOIN tbl_7 ON lunwen.lwtype = tbl_7.Herb_ID AND lunwen.lwtype = ' . $Herb_ID . ') LEFT JOIN tbl_8 ON tbl_8.MOL_ID = tbl_7.MOL_ID AND ob>= ' . $OB . ' AND dl>=' . $DL . ') LEFT JOIN tbl_9 ON tbl_9.MOL_ID = tbl_8.MOL_ID AND Score>=' . $value .') LEFT JOIN tbl_10 ON tbl_10.Target_ID = tbl_9.Target_ID) LEFT JOIN tbl_11 ON tbl_11.Target_ID=tbl_10.Target_ID) LEFT JOIN tbl_12 ON tbl_12.Pathway_ID=tbl_11.Pathway_ID AND (tbl_12.Pathway_ID IN (SELECT tmp_list.Pathway_ID FROM (SELECT tbl_11.Pathway_ID, COUNT(tbl_11.Pathway_ID) FROM lunwen, tbl_7, tbl_8, tbl_9, tbl_11 WHERE lunwen.lwtype = ' . $Herb_ID . ' AND ob>=' . $OB . ' AND dl>=' . $DL . ' AND Score>=' . $value . ' AND lunwen.lwtype = tbl_7.Herb_ID AND tbl_7.MOL_ID = tbl_9.MOL_ID AND tbl_9.Target_ID = tbl_11.Target_ID AND tbl_8.MOL_ID = tbl_7.MOL_ID GROUP BY tbl_11.Pathway_ID ORDER BY COUNT(tbl_11.Pathway_ID) DESC LIMIT ' . $fre . ') AS tmp_list) OR tbl_12.Pathway_ID IS NULL) WHERE MOL_Name IS NOT NULL OR Target_Name IS NOT NULL'; | |
| $result = mysql_query($sql); | |
| while($row = mysql_fetch_assoc($result)) | |
| { | |
| // 中药名称 | |
| if ($row['lwname'] && !isset($arr_node[$row['lwname']])) | |
| { | |
| $arr_node[$row['lwname']] = $i_node++; | |
| $ret["nodes"][] = ["name" => $row['lwname'], "value" => 1, "category" => 0, "symbolSize" => [1,1], "x" => 0, "y" => 0, "itemStyle" => ["opacity" => 0.6]]; | |
| } | |
| // 成分 | |
| if ($row['MOL_Name'] && !isset($arr_node[$row['MOL_Name']])) | |
| { | |
| $arr_node[$row['MOL_Name']] = $i_node++; | |
| $ret["nodes"][] = ["name" => $row['MOL_Name'], "value" => 1, "category" => 1, "symbolSize" => [1,1], "x" => 0, "y" => 0, "itemStyle" => ["opacity" => 0.6]]; | |
| } | |
| // 靶点 | |
| if ($row['Target_Name'] && !isset($arr_node[$row['Target_Name']])) | |
| { | |
| $arr_node[$row['Target_Name']] = $i_node++; | |
| $ret["nodes"][] = ["name" => $row['Target_Name'], "value" => 1, "category" => 2, "symbolSize" => [1,1], "x" => 0, "y" => 0, "itemStyle" => ["opacity" => 0.6]]; | |
| } | |
| // 通路 | |
| if ($row['Pathway_Name'] && !isset($arr_node[$row['Pathway_Name']])) | |
| { | |
| $arr_node[$row['Pathway_Name']] = $i_node++; | |
| $ret["nodes"][] = ["name" => $row['Pathway_Name'], "value" => 1, "category" => 3, "symbolSize" => [1,1], "x" => 0, "y" => 0, "itemStyle" => ["opacity" => 0.6]]; | |
| } | |
| // 中药-成分 连线 | |
| if ($row['lwname'] && $row['MOL_Name']) | |
| { | |
| $ret["links"][] = ["source" => $arr_node[$row['lwname']], "target" => $arr_node[$row['MOL_Name']]]; | |
| } | |
| // 成分-靶点 连线 | |
| if ($row['MOL_Name'] && $row['Target_Name']) | |
| { | |
| $ret["links"][] = ["source" => $arr_node[$row['MOL_Name']], "target" => $arr_node[$row['Target_Name']]]; | |
| } | |
| // 靶点-通路 连线 | |
| if ($row['Target_Name'] && $row['Pathway_Name']) | |
| { | |
| $ret["links"][] = ["source" => $arr_node[$row['Target_Name']], "target" => $arr_node[$row['Pathway_Name']]]; | |
| } | |
| } | |
| // 连线去重复 | |
| $ret["links"] = array_values(array_unique($ret["links"], SORT_REGULAR)); | |
| // 总度数(所有节点出度+入读的和) | |
| $TotalDeg = 2 * count($ret["links"]); | |
| // 各节点度数(出度+入度) | |
| $Deg = []; | |
| // 计算各节点出度+入度 | |
| foreach ($ret["links"] as $Onelink) | |
| { | |
| if (isset($Deg[$Onelink['source']])) | |
| { | |
| ++$Deg[$Onelink['source']]; | |
| } | |
| else | |
| { | |
| $Deg[$Onelink['source']] = 1; | |
| } | |
| if (isset($Deg[$Onelink['target']])) | |
| { | |
| ++$Deg[$Onelink['target']]; | |
| } | |
| else | |
| { | |
| $Deg[$Onelink['target']] = 1; | |
| } | |
| } | |
| // 上一个节点位置 | |
| $X = 0; | |
| $Y = 0; | |
| // 每行最大个数(默认50) | |
| if ($maxcount != 0) | |
| { | |
| $MaxNum = $maxcount; | |
| } | |
| else | |
| { | |
| $MaxNum = 50; | |
| } | |
| // 间距 | |
| $Dis = 90; | |
| // 设置每个节点大小 | |
| foreach ($ret["nodes"] as $index => $OneNode) | |
| { | |
| $NodeSize = 300 / $TotalDeg * $Deg[$index]; | |
| if ($NodeSize < 5) | |
| { | |
| $NodeSize = 5; | |
| } | |
| $ret["nodes"][$index]['symbolSize'] = [$NodeSize, $NodeSize]; | |
| } | |
| $X = 0; | |
| $Y += $Dis; | |
| // 当前一行数目 | |
| $i_num = 0; | |
| // 方向 | |
| $Dir = 1; | |
| // 设置每个成分节点位置 | |
| foreach ($ret["nodes"] as $index => $OneNode) | |
| { | |
| if ($OneNode['category'] === 1) | |
| { | |
| ++$i_num; | |
| $ret["nodes"][$index]['x'] = $X; | |
| $ret["nodes"][$index]['y'] = $Y; | |
| // 满一行 | |
| if ($i_num === $MaxNum) | |
| { | |
| $Y += 40; | |
| $X = 0; | |
| $i_num = 0; | |
| $Dir = 1; | |
| } | |
| else | |
| { | |
| $X += 40 * $Dir; | |
| $Dir = $Dir > 0 ? -$Dir - 1 : -$Dir + 1; | |
| } | |
| } | |
| } | |
| $X = 0; | |
| $Y += $Dis; | |
| // 当前一行数目 | |
| $i_num = 0; | |
| // 方向 | |
| $Dir = 1; | |
| // 设置每个靶点节点位置 | |
| foreach ($ret["nodes"] as $index => $OneNode) | |
| { | |
| if ($OneNode['category'] === 2) | |
| { | |
| ++$i_num; | |
| $ret["nodes"][$index]['x'] = $X; | |
| $ret["nodes"][$index]['y'] = $Y; | |
| // 满一行 | |
| if ($i_num === $MaxNum) | |
| { | |
| $Y += 40; | |
| $X = 0; | |
| $i_num = 0; | |
| $Dir = 1; | |
| } | |
| else | |
| { | |
| $X += 40 * $Dir; | |
| $Dir = $Dir > 0 ? -$Dir - 1 : -$Dir + 1; | |
| } | |
| } | |
| } | |
| $X = 0; | |
| $Y += $Dis; | |
| // 当前一行数目 | |
| $i_num = 0; | |
| // 方向 | |
| $Dir = 1; | |
| // 设置每个通路节点位置 | |
| foreach ($ret["nodes"] as $index => $OneNode) | |
| { | |
| if ($OneNode['category'] === 3) | |
| { | |
| ++$i_num; | |
| $ret["nodes"][$index]['x'] = $X; | |
| $ret["nodes"][$index]['y'] = $Y; | |
| // 满一行 | |
| if ($i_num === $MaxNum) | |
| { | |
| $Y += 40; | |
| $X = 0; | |
| $i_num = 0; | |
| $Dir = 1; | |
| } | |
| else | |
| { | |
| $X += 40 * $Dir; | |
| $Dir = $Dir > 0 ? -$Dir - 1 : -$Dir + 1; | |
| } | |
| } | |
| } | |
| echo json_encode($ret); | |
| ?> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?php | |
| if (!isset($_REQUEST['lwtype'])) | |
| { | |
| exit(); | |
| } | |
| ?> | |
| <html style="height: 100%"> | |
| <head> | |
| <meta charset="utf-8"> | |
| </head> | |
| <script src="../js/jquery-2.1.1.min.js"></script> | |
| <script src="../js/echarts.min.js"></script> | |
| <body style="height: 100%;"> | |
| <input type="hidden" name="lwtype" id="lwtype" value="<?php echo $_REQUEST['lwtype']; ?>" /> | |
| <fieldset> | |
| <legend>条件筛选</legend> | |
| <table style="margin: auto;"> | |
| <tr style="text-align: center;"> | |
| <td>成分:</td> | |
| <td> | |
| OB ≥ <input type="text" name="OB" id="OB" value="30" style="text-align: center;" /> | |
| </td> | |
| <td> | |
| DL ≥ <input type="text" name="DL" id="DL" value="0.18" style="text-align: center;" /> | |
| </td> | |
| <td colspan="2"> | |
| 靶点分值 ≥ <input type="text" name="value" id="value" value="95" style="text-align: center;" /> | |
| </td> | |
| <td colspan="2"> | |
| 通路频度前 <input type="text" name="fre" id="fre" value="10" style="text-align: center;" /> | |
| </td> | |
| <td colspan="2"> | |
| 每行最多显示 <input type="text" name="MaxCount" id="MaxCount" value="50" style="text-align: center;" /> | |
| </td> | |
| <td colspan="3"> | |
| <input id="search" type="button" style="width: 100%;height: 40px;" value="查找" /> | |
| </td> | |
| <td colspan="3"> | |
| <input id="back" type="button" style="width: 100%;height: 40px;" onclick="history.back()" value="返回" /> | |
| </td> | |
| </tr> | |
| </table> | |
| </fieldset> | |
| <div id="container" style="height: 100%;"></div> | |
| </body> | |
| <script type="text/javascript"> | |
| var dom = document.getElementById("container"); | |
| var myChart = echarts.init(dom); | |
| var app = {}; | |
| option = null; | |
| function SetView(json_webkitDep) | |
| { | |
| webkitDep = JSON.parse(json_webkitDep); | |
| myChart.hideLoading(); | |
| option = { | |
| legend: { | |
| data: ['中药材','成分', '靶点', '通路'] | |
| }, | |
| backgroundColor: 'rgba(0, 80, 100, 0.1)', | |
| series: [{ | |
| type: 'graph', | |
| layout: 'none', | |
| animation: true, | |
| label: { | |
| show: true, | |
| normal: { | |
| position: 'right', | |
| formatter: '{b}' | |
| } | |
| }, | |
| draggable: false, | |
| data: webkitDep.nodes.map(function (node, idx) { | |
| node.id = idx; | |
| return node; | |
| }), | |
| roam: true, | |
| nodeScaleRatio: 0.2, | |
| focusNodeAdjacency: true, | |
| categories: webkitDep.categories, | |
| edges: webkitDep.links | |
| }] | |
| }; | |
| myChart.setOption(option); | |
| } | |
| function GetAndShow() | |
| { | |
| myChart.showLoading({text: '加载中...'}); | |
| var _OB = $('#OB').val(); | |
| var _DL = $('#DL').val(); | |
| var _value = $('#value').val(); | |
| var _fre = $('#fre').val(); | |
| var _lwtype = $('#lwtype').val(); | |
| var _maxcount = $('#MaxCount').val(); | |
| $.ajax | |
| ( | |
| { | |
| url : './Getshow3Data.php', | |
| type : "post", | |
| data : {lwtype:_lwtype, OB:_OB, DL:_DL, value:_value, fre:_fre, maxcount:_maxcount}, | |
| async : true, | |
| success:function(ret){ | |
| SetView(ret); | |
| } | |
| } | |
| ); | |
| } | |
| $('#search').bind('click', function(){ | |
| GetAndShow(); | |
| }); | |
| $(document).ready(GetAndShow()); | |
| </script> | |
| </html> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment