javascript - D3 堆积面积图,x 轴作为月份名称,还带有图例
问题描述
我正在尝试使用 x 轴作为月份名称构建 D3 堆积面积图,但存在一些错误为 MNaN,并且在 D3 官方网站上,还有从文件(.csv. .json、.tsv 等)加载图表的数据) 但我想从数组中加载数据。工具提示(A \n Total(A) \n % of A)和图例也不可见。我指的是生成堆积面积图的代码:https ://www.d3-graph-gallery.com/graph/stackedarea_template.html
谁能帮我写代码,下面是所需的数据
数组结构:
var data = [
{
"Month": "Jan", "A": "372290.4", "B": "9609.42", "C": "5496.94", "D": "4478",
"E": "508005.08", "F": "188776.25", "G": "6637.87", "H": "0", "I": "109.36", "J": "357361.55", "Total": "1452764.87"
},
{
"Month": "Feb", "A": "739822.97", "B": "19218.84", "C": "12516.24", "D": "8956",
"E": "1018268.66", "F": "377525.74", "G": "15948.5", "H": "23.46", "I": "969.92", "J": "714723.1", "Total": "2907973.43"
},
{
"Month": "Mar", "A": "1108095.89", "B": "28828.26", "C": "22268.98", "D": "13434",
"E": "1528299.3", "F": "565977.38", "G": "28712.76", "H": "1027.62", "I": "3067.22", "J": "1072084.65", "Total": "4371796.06"
},
{
"Month": "Apr", "A": "1474738.92", "B": "38727.73", "C": "34389.72", "D": "17981.44",
"E": "2071177.85", "F": "754827.43", "G": "45430.62", "H": "7307.35", "I": "7312.26", "J": "1429446.2", "Total": "5881339.52"
},
{
"Month": "May", "A": "1834106.67", "B": "49394.68", "C": "52238.77", "D": "23057.93",
"E": "2585714.03", "F": "931441.48", "G": "66322.02", "H": "20124.51", "I": "13769.13", "J": "1786807.75", "Total": "7362976.97"
},
{
"Month": "Jun", "A": "2186201.94", "B": "65798.97", "C": "74773.06", "D": "31084",
"E": "3085654.69", "F": "1108985.53", "G": "93788.5", "H": "33374.4", "I": "25559.3", "J": "2144169.3", "Total": "8849389.69"
},
{
"Month": "July", "A": "2537665.76", "B": "87416.04", "C": "107505.33", "D": "40071.93",
"E": "3561821.35", "F": "1286529.58", "G": "128477.84", "H": "46917.84", "I": "39826.26", "J": "2501530.85", "Total": "10337762.78"
}
];
解决方案
重用您共享的链接中的一些代码,但使用最新版本的 d3 (v7),我已经共享了解决方案。适用于您的数组结构。
在 d3 图表中实现工具提示并不是很简单(未包含在附加的代码片段中)。您可以检查这两个示例以实现工具提示(使用 d3.bisect):
const data = [
{
Month: 'Jan',
A: '372290.4',
B: '9609.42',
C: '5496.94',
D: '4478',
E: '508005.08',
F: '188776.25',
G: '6637.87',
H: '0',
I: '109.36',
J: '357361.55',
Total: '1452764.87',
},
{
Month: 'Feb',
A: '739822.97',
B: '19218.84',
C: '12516.24',
D: '8956',
E: '1018268.66',
F: '377525.74',
G: '15948.5',
H: '23.46',
I: '969.92',
J: '714723.1',
Total: '2907973.43',
},
{
Month: 'Mar',
A: '1108095.89',
B: '28828.26',
C: '22268.98',
D: '13434',
E: '1528299.3',
F: '565977.38',
G: '28712.76',
H: '1027.62',
I: '3067.22',
J: '1072084.65',
Total: '4371796.06',
},
{
Month: 'Apr',
A: '1474738.92',
B: '38727.73',
C: '34389.72',
D: '17981.44',
E: '2071177.85',
F: '754827.43',
G: '45430.62',
H: '7307.35',
I: '7312.26',
J: '1429446.2',
Total: '5881339.52',
},
{
Month: 'May',
A: '1834106.67',
B: '49394.68',
C: '52238.77',
D: '23057.93',
E: '2585714.03',
F: '931441.48',
G: '66322.02',
H: '20124.51',
I: '13769.13',
J: '1786807.75',
Total: '7362976.97',
},
{
Month: 'Jun',
A: '2186201.94',
B: '65798.97',
C: '74773.06',
D: '31084',
E: '3085654.69',
F: '1108985.53',
G: '93788.5',
H: '33374.4',
I: '25559.3',
J: '2144169.3',
Total: '8849389.69',
},
{
Month: 'July',
A: '2537665.76',
B: '87416.04',
C: '107505.33',
D: '40071.93',
E: '3561821.35',
F: '1286529.58',
G: '128477.84',
H: '46917.84',
I: '39826.26',
J: '2501530.85',
Total: '10337762.78',
},
]
const margin = { top: 60, right: 230, bottom: 50, left: 80 }
const width = 660 - margin.left - margin.right
const height = 400 - margin.top - margin.bottom
const svg = d3
.select('#my_dataviz')
.append('svg')
.attr('width', width + margin.left + margin.right)
.attr('height', height + margin.top + margin.bottom)
.append('g')
.attr('transform', `translate(${margin.left}, ${margin.top})`)
const columns = Object.keys(data[0])
data.columns = columns
// List of groups = header of the csv files
const keys = data.columns.slice(1, -1)
const allValueColumns = data.columns.slice(1)
const yExtent = [0, 0]
const dataParsed = data.map(d => {
const pd = { ...d }
allValueColumns.forEach(col => {
pd[col] = parseFloat(d[col])
yExtent[0] = d3.min([pd[col], yExtent[0]])
yExtent[1] = d3.max([pd[col], yExtent[1]])
})
return pd
})
// color palette
const color = d3.scaleOrdinal().domain(keys).range(d3.schemeSet2)
// stack the data
const stackedData = d3.stack().keys(keys)(dataParsed)
const xDomain = dataParsed.map(d => d.Month)
const x = d3.scalePoint().domain(xDomain).range([0, width])
const xAxis = svg
.append('g')
.attr('transform', `translate(0, ${height})`)
.call(d3.axisBottom(x).ticks(5))
const y = d3.scaleLinear().domain(yExtent).range([height, 0])
const area = d3
.area()
.x(function (d) {
return x(d.data.Month)
})
.y0(function (d) {
return y(d[0])
})
.y1(function (d) {
return y(d[1])
})
svg
.append('g')
.selectAll('path')
.data(stackedData)
.enter()
.append('path')
.attr('class', function (d) {
return `area ${d.key}`
})
.style('fill', function (d) {
return color(d.key)
})
.attr('d', area)
svg.append('g').call(d3.axisLeft(y).ticks(5))
<div id="my_dataviz" ></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/7.1.1/d3.min.js" integrity="sha512-COTaPOlz12cG4fSfcBsxZsjauBAyldqp+8FQUM/dZHm+ts/jR4AFoJhCqxy8K10Jrf3pojfsbq7fAPTb1XaVkg==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
推荐阅读
- microcontroller - 在 I2C 总线中,从设备如何知道数据是否属于它们
- javascript - iFrame 中 Firefox 上的麦克风权限不是永久性的
- spring - Keycloak - 找不到指定孩子的公钥
- java - 断言对象是一个有效的顶级 json 可序列化
- google-cloud-platform - 当我使用 Google Cloud Application Flex 提供的 Memcache 服务时,“session_memcached_host:”会是什么。引擎?
- angular - 具有延迟加载和子路由设置的 Angular
- javascript - matter.js 物理引擎中的结果总是不同的
- android - java.lang.NullPointerException:空对象引用上的 FloatingActionButton.setVisibility(int)'
- django - Django selenium:i18n 部分有效
- r - NA 使用 pivot_wider