VChart icon indicating copy to clipboard operation
VChart copied to clipboard

Inner Offset without Tooltip

Open jonyeokj opened this issue 1 year ago • 2 comments

What problem does this feature solve?

Right now, when I put inner offset on my time axis to make my graph look smaller and shift my labels inwards, i.e innerOffset: { left: 20, right: 20, }, I can still hover on the tooltip on the outer area of the graph and I get unexpected data, according to the y-axis of the graph. I would like an option to toggle this off or another alternative to inner Offset.

What does the proposed API look like?

No change to API

jonyeokj avatar Jul 09 '24 08:07 jonyeokj

@jonyeokj can you share the whole spec of your case?

xile611 avatar Jul 10 '24 01:07 xile611

const itemData = [ { key: '1719981900', value: '0', }, { key: '1719982200', value: '3', }, { key: '1719982500', value: '2', }, { key: '1719982800', value: '1', }, { key: '1719983100', value: '1', }, { key: '1719983400', value: '1', }, { key: '1719983700', value: '1', }, { key: '1719984000', value: '7', }, { key: '1719984300', value: '1', }, { key: '1719984600', value: '4', }, { key: '1719984900', value: '8', }, { key: '1719985200', value: '10', }, { key: '1719985500', value: '3', }, { key: '1719985800', value: '0', }, { key: '1719986100', value: '3', }, { key: '1719986400', value: '1', }, { key: '1719986700', value: '8', }, { key: '1719987000', value: '5', }, { key: '1719987300', value: '4', }, { key: '1719987600', value: '11', }, ];

const gmvData = [ { key: '1719981900', amount: { amount_formatted: 'S$0.00', amount_delimited: '0.00', amount: '0', currency_code: 'SGD', currency_symbol: 'S$', }, }, { key: '1719982200', amount: { amount_formatted: 'S$38.64', amount_delimited: '38.64', amount: '38.64', currency_code: 'SGD', currency_symbol: 'S$', }, }, { key: '1719982500', amount: { amount_formatted: 'S$14.78', amount_delimited: '14.78', amount: '14.78', currency_code: 'SGD', currency_symbol: 'S$', }, }, { key: '1719982800', amount: { amount_formatted: 'S$11.67', amount_delimited: '11.67', amount: '11.67', currency_code: 'SGD', currency_symbol: 'S$', }, }, { key: '1719983100', amount: { amount_formatted: 'S$6.05', amount_delimited: '6.05', amount: '6.05', currency_code: 'SGD', currency_symbol: 'S$', }, }, { key: '1719983400', amount: { amount_formatted: 'S$12.86', amount_delimited: '12.86', amount: '12.86', currency_code: 'SGD', currency_symbol: 'S$', }, }, { key: '1719983700', amount: { amount_formatted: 'S$14.85', amount_delimited: '14.85', amount: '14.85', currency_code: 'SGD', currency_symbol: 'S$', }, }, { key: '1719984000', amount: { amount_formatted: 'S$68.02', amount_delimited: '68.02', amount: '68.02', currency_code: 'SGD', currency_symbol: 'S$', }, }, { key: '1719984300', amount: { amount_formatted: 'S$6.72', amount_delimited: '6.72', amount: '6.72', currency_code: 'SGD', currency_symbol: 'S$', }, }, { key: '1719984600', amount: { amount_formatted: 'S$33.37', amount_delimited: '33.37', amount: '33.37', currency_code: 'SGD', currency_symbol: 'S$', }, }, { key: '1719984900', amount: { amount_formatted: 'S$57.15', amount_delimited: '57.15', amount: '57.15', currency_code: 'SGD', currency_symbol: 'S$', }, }, { key: '1719985200', amount: { amount_formatted: 'S$60.21', amount_delimited: '60.21', amount: '60.21', currency_code: 'SGD', currency_symbol: 'S$', }, }, { key: '1719985500', amount: { amount_formatted: 'S$48.41', amount_delimited: '48.41', amount: '48.41', currency_code: 'SGD', currency_symbol: 'S$', }, }, { key: '1719985800', amount: { amount_formatted: 'S$0.00', amount_delimited: '0.00', amount: '0', currency_code: 'SGD', currency_symbol: 'S$', }, }, { key: '1719986100', amount: { amount_formatted: 'S$26.51', amount_delimited: '26.51', amount: '26.51', currency_code: 'SGD', currency_symbol: 'S$', }, }, { key: '1719986400', amount: { amount_formatted: 'S$8.76',

  amount_delimited: '8.76',
  amount: '8.76',
  currency_code: 'SGD',
  currency_symbol: 'S$',
},

}, { key: '1719986700', amount: { amount_formatted: 'S$62.26', amount_delimited: '62.26', amount: '62.26', currency_code: 'SGD', currency_symbol: 'S$', }, }, { key: '1719987000', amount: { amount_formatted: 'S$44.60', amount_delimited: '44.60', amount: '44.6', currency_code: 'SGD', currency_symbol: 'S$', }, }, { key: '1719987300', amount: { amount_formatted: 'S$25.96', amount_delimited: '25.96', amount: '25.96', currency_code: 'SGD', currency_symbol: 'S$', }, }, { key: '1719987600', amount: { amount_formatted: 'S$98.05', amount_delimited: '98.05', amount: '98.05', currency_code: 'SGD', currency_symbol: 'S$', }, }, ];

const transformedItemData = itemData.map(({ key, value }) => ({ x: Number(key), y: Number(value), type: 'SKU orders created', displayValue: value, color: 'blue', }));

const transformedGmvData = gmvData.map(({ key, amount }) => ({ x: Number(key), y: Number(amount.amount), type: 'GMV', displayValue: S$${amount.amount}, color: 'green', }));

const getFirstKey = (data) => { if (data.length > 0) { return data[0].key; } return null; };

const getLastKey = (data) => { if (data.length > 0) { return data[data.length - 1].key; } return null; };

const spec = { type: 'line', padding: 0, data: [ { id: 'item_sold', values: transformedItemData, }, { id: 'gmv', values: transformedGmvData, }, ], series: [ { type: 'line', id: 'line0', dataId: 'item_sold', line: { style: { stroke: { gradient: 'linear', stops: [ { offset: 0, color: 'red', }, { offset: 1, color: 'blue', }, ], }, lineWidth: 3, curveType: 'monotone', }, }, seriesField: 'type', xField: 'x', yField: 'y', stack: true, }, { type: 'line', id: 'line1', dataId: 'gmv', line: { style: { stroke: { gradient: 'linear', stops: [ { offset: 0, color: 'yellow', }, { offset: 1, color: 'green', }, ], }, lineWidth: 3, curveType: 'monotone', }, }, seriesField: 'type', xField: 'x', yField: 'y', stack: true, }, ], axes: [ { orient: 'left', seriesId: ['line0'], id: 'axisLeft', domainLine: { visible: false, }, expand: { max: 0.1, }, grid: { style: { stroke: '#5D75C0', strokeOpacity: 0.4, lineWidth: 1, }, }, label: { formatter: '{label:.2s}', style: { fill: '#E5ECFF', fontWeight: 400, fontSize: 16, }, }, tick: { tickCount: 6, forceTickCount: 6, }, }, { orient: 'right', seriesId: ['line1'], id: 'axisRight', sync: { axisId: 'axisLeft', tickAlign: true }, grid: { visible: false, }, label: { formatter: '{label:.2s}', style: { fill: '#E5ECFF', fontWeight: 400, fontSize: 16, }, }, }, { orient: 'bottom', type: 'time', sampling: false, softMin: getFirstKey(itemData), softMax: getLastKey(itemData), layers: [ { timeFormat: '%H:%M', }, ], innerOffset: { left: 20, right: 20, }, domainLine: { style: { stroke: '#5D75C0', lineWidth: 2, }, }, grid: { visible: false, }, label: { space: 0, style: { fill: '#E5ECFF', fontWeight: 400, fontSize: 16, lineHeight: 40, }, }, tick: { visible: true, tickCount: 5, forceTickCount: 5, }, }, ], legends: [ { padding: [15, 10, 15, 0], visible: true, position: 'start', orient: 'top', item: { shape: { style: { size: 16, symbolType: 'roundLine', }, }, label: { space: 1, formatMethod: (text) => { return { type: 'rich', text: [ { text, fill: '#E5E5FF', opacity: 0.8, fontSize: 14, fontWeight: '500', lineHeight: 20, }, ], }; }, }, }, hover: false, offsetY: 5, }, ], tooltip: { renderMode: 'canvas', dimension: { title: { valueTimeFormat: '%H:%M', }, content: [ { key: (datum) => ${datum.type}: ${datum.displayValue}, }, ], position: 'bottom', positionMode: 'pointer', }, style: { panel: { padding: 24, backgroundColor: '#32326C', border: { radius: 16, }, }, titleLabel: { fontSize: 16, fill: 'rgba(229, 236, 255, 0.6)', lineHeight: 21, fontWeight: 300, }, keyLabel: { fontSize: 16, fill: '#FFFFFF', lineHeight: 22, }, spaceRow: 8, }, }, crosshair: [ { followTooltip: true, xField: { line: { type: 'line', style: { lineDash: [], stroke: '#799BFF', }, }, }, }, ], point: { visible: false, }, background: 'black', };

jonyeokj avatar Jul 10 '24 11:07 jonyeokj