UNPKG

plotly.js

Version:

The open source javascript graphing library that powers plotly

139 lines (114 loc) 4.36 kB
/** * Copyright 2012-2020, Plotly, Inc. * All rights reserved. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ 'use strict'; var traceIs = require('../../registry').traceIs; var autoType = require('./axis_autotype'); /* * data: the plot data to use in choosing auto type * name: axis object name (ie 'xaxis') if one should be stored */ module.exports = function handleTypeDefaults(containerIn, containerOut, coerce, options) { coerce('autotypenumbers', options.autotypenumbersDflt); var axType = coerce('type', (options.splomStash || {}).type); if(axType === '-') { setAutoType(containerOut, options.data); if(containerOut.type === '-') { containerOut.type = 'linear'; } else { // copy autoType back to input axis // note that if this object didn't exist // in the input layout, we have to put it in // this happens in the main supplyDefaults function containerIn.type = containerOut.type; } } }; function setAutoType(ax, data) { // new logic: let people specify any type they want, // only autotype if type is '-' if(ax.type !== '-') return; var id = ax._id; var axLetter = id.charAt(0); var i; // support 3d if(id.indexOf('scene') !== -1) id = axLetter; var d0 = getFirstNonEmptyTrace(data, id, axLetter); if(!d0) return; // first check for histograms, as the count direction // should always default to a linear axis if(d0.type === 'histogram' && axLetter === {v: 'y', h: 'x'}[d0.orientation || 'v'] ) { ax.type = 'linear'; return; } var calAttr = axLetter + 'calendar'; var calendar = d0[calAttr]; var opts = {noMultiCategory: !traceIs(d0, 'cartesian') || traceIs(d0, 'noMultiCategory')}; // To not confuse 2D x/y used for per-box sample points for multicategory coordinates if(d0.type === 'box' && d0._hasPreCompStats && axLetter === {h: 'x', v: 'y'}[d0.orientation || 'v'] ) { opts.noMultiCategory = true; } opts.autotypenumbers = ax.autotypenumbers; // check all boxes on this x axis to see // if they're dates, numbers, or categories if(isBoxWithoutPositionCoords(d0, axLetter)) { var posLetter = getBoxPosLetter(d0); var boxPositions = []; for(i = 0; i < data.length; i++) { var trace = data[i]; if(!traceIs(trace, 'box-violin') || (trace[axLetter + 'axis'] || axLetter) !== id) continue; if(trace[posLetter] !== undefined) boxPositions.push(trace[posLetter][0]); else if(trace.name !== undefined) boxPositions.push(trace.name); else boxPositions.push('text'); if(trace[calAttr] !== calendar) calendar = undefined; } ax.type = autoType(boxPositions, calendar, opts); } else if(d0.type === 'splom') { var dimensions = d0.dimensions; var dim = dimensions[d0._axesDim[id]]; if(dim.visible) ax.type = autoType(dim.values, calendar, opts); } else { ax.type = autoType(d0[axLetter] || [d0[axLetter + '0']], calendar, opts); } } function getFirstNonEmptyTrace(data, id, axLetter) { for(var i = 0; i < data.length; i++) { var trace = data[i]; if(trace.type === 'splom' && trace._length > 0 && (trace['_' + axLetter + 'axes'] || {})[id] ) { return trace; } if((trace[axLetter + 'axis'] || axLetter) === id) { if(isBoxWithoutPositionCoords(trace, axLetter)) { return trace; } else if((trace[axLetter] || []).length || trace[axLetter + '0']) { return trace; } } } } function getBoxPosLetter(trace) { return {v: 'x', h: 'y'}[trace.orientation || 'v']; } function isBoxWithoutPositionCoords(trace, axLetter) { var posLetter = getBoxPosLetter(trace); var isBox = traceIs(trace, 'box-violin'); var isCandlestick = traceIs(trace._fullInput || {}, 'candlestick'); return ( isBox && !isCandlestick && axLetter === posLetter && trace[posLetter] === undefined && trace[posLetter + '0'] === undefined ); }