Skip to content

Instantly share code, notes, and snippets.

@InJeCTrL
Created March 17, 2020 07:23
Show Gist options
  • Select an option

  • Save InJeCTrL/bc562751c5bc63178b03481c3863d1bd to your computer and use it in GitHub Desktop.

Select an option

Save InJeCTrL/bc562751c5bc63178b03481c3863d1bd to your computer and use it in GitHub Desktop.
一种分层级显示散点图
<?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);
?>
<?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