Javascript 使用getData()将表格数据馈送到D3图表中
有没有人对使用Tableau函数格式化和提供底层数据有什么建议?我知道我需要为基础数据创建一个数组,但不确定如何创建。基础数据采用以下JSON格式:Javascript 使用getData()将表格数据馈送到D3图表中,javascript,d3.js,tableau-api,Javascript,D3.js,Tableau Api,有没有人对使用Tableau函数格式化和提供底层数据有什么建议?我知道我需要为基础数据创建一个数组,但不确定如何创建。基础数据采用以下JSON格式: [[ { "value":"Thais Sissman", "formattedValue":"Thais Sissman" }, { "value":"-0.6860335195530726", "formattedValue":"-68.6%" },
[[
{
"value":"Thais Sissman",
"formattedValue":"Thais Sissman"
},
{
"value":"-0.6860335195530726",
"formattedValue":"-68.6%"
},
{
"value":"-3.3156",
"formattedValue":"($3)"
},
{
"value":"793",
"formattedValue":"793"
},
{
"value":"4.833000000000001",
"formattedValue":"$5"
}
],
[
{
"value":"Lela Donovan",
"formattedValue":"Lela Donovan"
},
{
"value":"0.0875",
"formattedValue":"8.8%"
},
{
"value":"0.4641",
"formattedValue":"$0"
},
{
"value":"792",
"formattedValue":"792"
},
{
"value":"5.304",
"formattedValue":"$5"
}
]]
以下是我的JavaScript代码:
$(document).ready(function initViz() {
var containerDiv = document.getElementById("vizContainer"),
url = "https://SERVER-NAME/t/gfm/views/Superstore/Customers?:embed=y&:showShareOptions=true&:display_count=no&:showVizHome=no",
options = {
hideTabs: true,
hideToolbar: true,
onFirstInteractive: function () {
document.getElementById('getData').disabled = false; // Enable our button
}
};
viz = new tableau.Viz(containerDiv, url, options);
});
//when viz is loaded (onFirstInteractive), request data
function getSummaryData() {
options = {
maxRows: 0, // Max rows to return. Use 0 to return all rows
ignoreAliases: false,
ignoreSelection: true,
includeAllColumns: false
};
sheet = viz.getWorkbook().getActiveSheet();
//if active tab is a worksheet, get data from that sheet
if (sheet.getSheetType() === 'worksheet') {
sheet.getSummaryDataAsync(options).then(function (t) {
buildMenu(t);
});
//if active sheet is a dashboard get data from a specified sheet
} else {
worksheetArray = viz.getWorkbook().getActiveSheet().getWorksheets();
for (var i = 0; i < worksheetArray.length; i++) {
worksheet = worksheetArray[i];
sheetName = worksheet.getName();
if (sheetName == 'CustomerRank') {
worksheetArray[i].getSummaryDataAsync(options).then(function (t) {
var data = t.getData();
var columns = t.getColumns();
table = t;
var tgt = document.getElementById("dataTarget");
tgt.innerHTML = "<h4>Underlying Data:</h4><p>" + JSON.stringify(table.getData()) + "</p>";
buildVisual(t);
});
}
}
}
}
function buildVisual(table) {
//the data returned from the tableau API
var columns = table.getColumns();
var data = table.getData();
//convert to field:values convention
function reduceToObjects(cols,data) {
var fieldNameMap = $.map(cols, function(col) { return col.getFieldName(); });
var dataToReturn = $.map(data, function(d) {
return d.reduce(function(memo, value, idx) {
memo[fieldNameMap[idx]] = value.value; return memo;
}, {});
});
return dataToReturn;
}
var niceData = reduceToObjects(columns, data);
var svg = d3.select('body')
.append('svg')
.attr('width', 400)
.attr('height', 200)
.attr('id', 'chart');
// add an SVG group element for each user
var series = svg.selectAll('g.series')
.data(d3.keys(dataTarget))
.enter()
.append('g')
.attr('class', 'series');
var width = 300,
height = 300,
radius = Math.min(width, height) / 2;
var color = d3.scale.category20();
var pie = d3.layout.pie()
.sort(null);
var piedata = pie(niceData.data);
var arc = d3.svg.arc()
.innerRadius(radius - 100)
.outerRadius(radius - 50);
var svg = d3.select("body").append("svg")
.attr("width", width)
.attr("height", height)
.append("g")
.attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");
var path = svg.selectAll("path")
.data(piedata)
.enter().append("path")
.attr("fill", function(d, i) { return color(i); })
.attr("d", arc);
svg.selectAll("text").data(piedata)
.enter()
.append("text")
.attr("text-anchor", "middle")
.attr("x", function(d) {
var a = d.startAngle + (d.endAngle - d.startAngle)/2 - Math.PI/2;
d.cx = Math.cos(a) * (radius - 75);
return d.x = Math.cos(a) * (radius - 20);
})
.attr("y", function(d) {
var a = d.startAngle + (d.endAngle - d.startAngle)/2 - Math.PI/2;
d.cy = Math.sin(a) * (radius - 75);
return d.y = Math.sin(a) * (radius - 20);
})
.text(function(d) { return d.value; })
.each(function(d) {
var bbox = this.getBBox();
d.sx = d.x - bbox.width/2 - 2;
d.ox = d.x + bbox.width/2 + 2;
d.sy = d.oy = d.y + 5;
});
svg.append("defs").append("marker")
.attr("id", "circ")
.attr("markerWidth", 6)
.attr("markerHeight", 6)
.attr("refX", 3)
.attr("refY", 3)
.append("circle")
.attr("cx", 3)
.attr("cy", 3)
.attr("r", 3);
svg.selectAll("path.pointer").data(piedata).enter()
.append("path")
.attr("class", "pointer")
.style("fill", "none")
.style("stroke", "black")
.attr("marker-end", "url(#circ)")
.attr("d", function(d) {
if(d.cx > d.ox) {
return "M" + d.sx + "," + d.sy + "L" + d.ox + "," + d.oy + " " + d.cx + "," + d.cy;
} else {
return "M" + d.ox + "," + d.oy + "L" + d.sx + "," + d.sy + " " + d.cx + "," + d.cy;
}
});
}
$(document).ready(函数initViz(){
var containerDiv=document.getElementById(“vizContainer”),
url=”https://SERVER-NAME/t/gfm/views/Superstore/Customers?:embed=y&:showShareOptions=true&:display_count=no&:showVizHome=no",
选项={
希德塔布斯:没错,
是的,
onFirstInteractive:函数(){
document.getElementById('getData')。disabled=false;//启用我们的按钮
}
};
viz=新的tableau.viz(containerDiv、url、选项);
});
//加载viz(onFirstInteractive)时,请求数据
函数getSummaryData(){
选项={
maxRows:0,//要返回的最大行数。使用0返回所有行
忽略别名:false,
忽略选择:正确,
includealcolumns:false
};
sheet=viz.getWorkbook().getActiveSheet();
//如果活动选项卡是工作表,则从该工作表获取数据
如果(sheet.getSheetType()=='工作表'){
sheet.getSummaryDataAsync(选项).then(函数(t){
构建菜单(t);
});
//如果活动工作表是仪表板,则从指定工作表获取数据
}否则{
worksheetArray=viz.getWorkbook().getActiveSheet().getWorksheets();
对于(变量i=0;i”;
建筑视觉(t);
});
}
}
}
}
函数buildVisual(表){
//从tableau API返回的数据
var columns=table.getColumns();
var data=table.getData();
//转换为字段:值约定
函数约简对象(列、数据){
var fieldNameMap=$.map(cols,函数(col){return col.getFieldName();});
var dataToReturn=$.map(数据,函数(d){
返回d.reduce(函数(备注、值、idx){
备注[fieldNameMap[idx]]=value.value;返回备注;
}, {});
});
返回数据返回;
}
var niceData=reducetobjects(列、数据);
var svg=d3.select('body')
.append('svg')
.attr('width',400)
.attr('height',200)
.attr('id','chart');
//为每个用户添加一个SVG组元素
var series=svg.selectAll('g.series')
.数据(d3.键(数据目标))
.输入()
.append('g')
.attr(“类”、“系列”);
可变宽度=300,
高度=300,
半径=数学最小值(宽度、高度)/2;
var color=d3.scale.category20();
var pie=d3.layout.pie()
.sort(空);
var piedata=pie(niceData.data);
var arc=d3.svg.arc()
.内半径(半径-100)
.外层(半径-50);
var svg=d3.选择(“正文”).追加(“svg”)
.attr(“宽度”,宽度)
.attr(“高度”,高度)
.附加(“g”)
.attr(“变换”、“平移”(+width/2+)、“+height/2+”);
var path=svg.selectAll(“路径”)
.数据(piedata)
.enter().append(“路径”)
.attr(“fill”,函数(d,i){返回颜色(i);})
.attr(“d”,弧);
svg.selectAll(“文本”).data(piedata)
.输入()
.append(“文本”)
.attr(“文本锚定”、“中间”)
.attr(“x”,函数(d){
var a=d.startAngle+(d.endAngle-d.startAngle)/2-Math.PI/2;
d、 cx=数学cos(a)*(半径-75);
返回d.x=数学cos(a)*(半径-20);
})
.attr(“y”,函数(d){
var a=d.startAngle+(d.endAngle-d.startAngle)/2-Math.PI/2;
d、 cy=数学sin(a)*(半径-75);
返回d.y=数学sin(a)*(半径-20);
})
.text(函数(d){返回d.value;})
.每个功能(d){
var bbox=this.getBBox();
d、 sx=d.x-bbox.width/2-2;
d、 ox=d.x+bbox.width/2+2;
d、 sy=d.oy=d.y+5;
});
svg.append(“defs”).append(“marker”)
.attr(“id”、“circ”)
.attr(“markerWidth”,6)
.attr(“markerHeight”,6)
.attr(“参考文献”,3)
.attr(“参考文献”,第3页)
.附加(“圆圈”)
.attr(“cx”,3)
.attr(“cy”,3)
.attr(“r”,3);
selectAll(“path.pointer”).data(piedata).enter()
.append(“路径”)
.attr(“类”、“指针”)
.style(“填充”、“无”)
.style(“笔划”、“黑色”)
.attr(“标记结束”、“url(#circ)”)
.attr(“d”,函数(d){
如果(d.cx>d.ox){
返回“M”+d.sx+”、“+d.sy+”L”+d.ox+”、“+d.oy+”、“+d.cx+”、“+d.cy”;
}否则{
返回“M”+d.ox+,“+d.oy+”L“+d.sx+”,“+d.sy+”,“+d.cx+”,“+d.cy”;
}
});
}