plotly.js
Version:
The open source javascript graphing library that powers plotly
123 lines (98 loc) • 3.94 kB
JavaScript
;
var Lib = require('../../lib');
var attributes = require('./attributes');
var Color = require('../../components/color');
var handleDomainDefaults = require('../../plots/domain').defaults;
var handleHoverLabelDefaults = require('../../components/fx/hoverlabel_defaults');
var Template = require('../../plot_api/plot_template');
var handleArrayContainerDefaults = require('../../plots/array_container_defaults');
module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout) {
function coerce(attr, dflt) {
return Lib.coerce(traceIn, traceOut, attributes, attr, dflt);
}
var hoverlabelDefault = Lib.extendDeep(layout.hoverlabel, traceIn.hoverlabel);
// node attributes
var nodeIn = traceIn.node;
var nodeOut = Template.newContainer(traceOut, 'node');
function coerceNode(attr, dflt) {
return Lib.coerce(nodeIn, nodeOut, attributes.node, attr, dflt);
}
coerceNode('label');
coerceNode('groups');
coerceNode('x');
coerceNode('y');
coerceNode('pad');
coerceNode('thickness');
coerceNode('line.color');
coerceNode('line.width');
coerceNode('hoverinfo', traceIn.hoverinfo);
handleHoverLabelDefaults(nodeIn, nodeOut, coerceNode, hoverlabelDefault);
coerceNode('hovertemplate');
coerceNode('align');
coerceNode('sort');
var colors = layout.colorway;
const defaultNodePalette = (i) => colors[i % colors.length];
coerceNode(
'color',
nodeOut.label.map((d, i) => Color.addOpacity(defaultNodePalette(i), 0.8))
);
coerceNode('customdata');
// link attributes
var linkIn = traceIn.link || {};
var linkOut = Template.newContainer(traceOut, 'link');
function coerceLink(attr, dflt) {
return Lib.coerce(linkIn, linkOut, attributes.link, attr, dflt);
}
coerceLink('label');
coerceLink('arrowlen');
coerceLink('source');
coerceLink('target');
coerceLink('value');
coerceLink('line.color');
coerceLink('line.width');
coerceLink('hoverinfo', traceIn.hoverinfo);
handleHoverLabelDefaults(linkIn, linkOut, coerceLink, hoverlabelDefault);
coerceLink('hovertemplate');
coerceLink('sort');
var darkBG = Color.luminosity(layout.paper_bgcolor) < 0.333;
var defaultLinkColor = darkBG ? 'rgba(255, 255, 255, 0.6)' : 'rgba(0, 0, 0, 0.2)';
var linkColor = coerceLink('color', defaultLinkColor);
function makeDefaultHoverColor(_linkColor) {
// hopefully the user-specified color is valid, but if not that can be caught elsewhere
if (!Color.isValid(_linkColor)) return _linkColor;
const alpha = Color.opacity(_linkColor);
if (alpha <= 0.8) {
return Color.addOpacity(_linkColor, alpha + 0.2);
} else {
return darkBG ? Color.brighten(_linkColor, 10) : Color.adjustLightness(_linkColor, -10);
}
}
coerceLink(
'hovercolor',
Array.isArray(linkColor) ? linkColor.map(makeDefaultHoverColor) : makeDefaultHoverColor(linkColor)
);
coerceLink('customdata');
handleArrayContainerDefaults(linkIn, linkOut, {
name: 'colorscales',
handleItemDefaults: concentrationscalesDefaults
});
handleDomainDefaults(traceOut, layout, coerce);
coerce('orientation');
coerce('direction');
coerce('valueformat');
coerce('valuesuffix');
const dfltArrangement = nodeOut.x.length && nodeOut.y.length ? 'freeform' : undefined;
coerce('arrangement', dfltArrangement);
Lib.coerceFont(coerce, 'textfont', layout.font, { autoShadowDflt: true });
// Ensure _length is defined
traceOut._length = null;
};
function concentrationscalesDefaults(In, Out) {
function coerce(attr, dflt) {
return Lib.coerce(In, Out, attributes.link.colorscales, attr, dflt);
}
coerce('label');
coerce('cmin');
coerce('cmax');
coerce('colorscale');
}