scripts/experiment-properties/graphing/d3-custom-plots/distractor_scatter_plot.js
import {plot_scatter_points} from "/scripts/experiment-properties/graphing/d3-base-plots/scatter_plot.js";
export {create_distractor_scatter_plot};
var BUFFER = 60;
var RANGE_ADJUSTMENT = 15;
/**
* D3 code for setting up scatter plot chart area with distractor dataset (so two-populations per graph)
*
* @param {object} attributes
*/
function create_distractor_scatter_plot(attributes) {
let target_dataset = attributes["target"]["dataset"];
console.log("target_dataset: " + JSON.stringify(target_dataset));
let target_properties = attributes["target"]["graph_attributes"];
console.log("target_properties: " + JSON.stringify(target_properties));
let distractor_dataset = attributes["distractor"]["dataset"];
console.log("distractor_dataset: " + JSON.stringify(distractor_dataset));
let distractor_properties = attributes["distractor"]["graph_attributes"];
console.log("distractor_properties: " + JSON.stringify(distractor_properties));
// Size of the graph
var window_height_multiplier = 0.65;
var window_width_multiplier = 0.5;
if (target_properties.alternate_scaling) {
BUFFER = 150;
window_height_multiplier = 1.15;
window_width_multiplier = .75;
}
let height = window.innerHeight * window_height_multiplier;
let width = height * window_width_multiplier;
// Create scales:
// ** D3 creates a function that takes in input between [0, 100] and
// outputs between [0, width].
// Basically, domain = input, range = ouput.
let xscale = d3.scaleLinear()
.domain([0, 1])
.range([0, width - RANGE_ADJUSTMENT]);
let yscale = d3.scaleLinear()
.domain([0, 1])
.range([height/2, 0 + RANGE_ADJUSTMENT]);
if (target_properties.alternate_scaling) {
// Numerosity experiments do not scale the distribution
// coordinates down to the range of [0,1] so the
// call to .domain() in the scaleLinear() method is needed
// scale the domain down into the appropriate range
var x_max = target_properties.row;
var y_max = target_properties.col;
xscale = d3.scaleLinear()
.domain([0, x_max])
.range([0, width - RANGE_ADJUSTMENT]);
yscale = d3.scaleLinear()
.domain([0, y_max])
.range([height/2, 0 + RANGE_ADJUSTMENT]);
}
// Create axes:
let x_axis = d3.axisBottom()
.scale(xscale)
.tickSize([0]);
let y_axis = d3.axisLeft()
.scale(yscale)
.tickSize([0]);
// Append SVG into graph div
let chart = d3.select("#graph")
.append("svg")
.attr("width", width + BUFFER)
.attr("height", height)
.attr("style", `margin-right: ${width/2}; margin-top: 25vh; margin-left: ${BUFFER}`);
// Creating transform SVG elements + append to SVG:
let yAxisElements = chart.append("g")
.attr("transform", "translate(50, 10)")
.call(y_axis);
let xAxisTranslate = height/2 + 10;
let xAxisElements = chart.append("g")
.attr("transform", "translate(50, " + xAxisTranslate +")")
.call(x_axis)
// If dist point color is WHITE, only plot the targets
if (distractor_properties["point_color"] === "WHITE") {
plot_scatter_points(chart, xscale, yscale, target_dataset, target_properties);
}
else {
let larger_data;
let smaller_data;
// Handle if the number of points between distractor & target are unequal
if (attributes["target"]["dataset"].length > attributes["distractor"]["dataset"].length) {
larger_data = attributes["target"];
smaller_data = attributes["distractor"];
} else {
larger_data = attributes["distractor"];
smaller_data = attributes["target"];
}
// Alternate plotting of distractor and main dataset points - want equal chance of one
// getting occluded over the other
for (let j in larger_data["dataset"]) {
if ( j < smaller_data["dataset"].length){
let small_point = smaller_data["dataset"][j];
plot_scatter_points(chart, xscale, yscale, [small_point], smaller_data["graph_attributes"]);
}
let large_point = larger_data["dataset"][j];
plot_scatter_points(chart, xscale, yscale, [large_point], larger_data["graph_attributes"]);
}
}
// Set axis color
chart.selectAll("path")
.attr("stroke", target_properties["axis_color"]);
// Remove tick labels
chart.selectAll("text").remove();
}