【问题标题】:D3 stacked area chart with x-axis as Month names and also with LegendsD3 堆积面积图,x 轴作为月份名称,还带有图例
【发布时间】:2021-11-29 09:25:23
【问题描述】:

我正在尝试构建以 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"
    }
];

【问题讨论】:

  • 请分享您的数组结构。我可以想象两种结构: 1. arrayOfArrays = [['Month', 'A', 'B', 'C', 'D', 'E'], ['Jan', 37, 96, 54, 44, 50, 18], ...] 2 arrayOfObjects = [{Month: 'Jan', A: 37, ....}, {...}, ...]数组结构。
  • 嗨@Shreshth,我已经用数组结构更新了我的问题。

标签: javascript d3.js charts


【解决方案1】:

重复使用您共享的链接中的一些代码,但使用最新版本的 d3 (v7),我已经共享了解决方案。适用于您的数组结构。

在 d3 图表中实现工具提示并不是很简单(未包含在附加的代码 sn-p 中)。您可以查看这两个示例以实现工具提示(使用 d3.bisect):

  1. With old d3 version (v3)
  2. With newer version, not latest (v5)

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>

【讨论】:

  • 嗨@Shreshth,我尝试使用您上面的代码,效果很好。谢谢你。但是对于我尝试使用您提供的上述两个链接的工具提示,它们也有效,但问题是我想要特定区域(即 A 或 B 或 C 或 ...)的工具提示而不是点。如果您可以提供帮助,我希望工具提示在图表中显示该区域的标签名称、计数和百分比。对于工具提示,您可以参考我试过的这个 codepen 链接,但没有运气codepen.io/hazdik/pen/RwbrLQK 这个 codepen 链接包含圆环图,它显示了我想要的工具提示。
猜你喜欢
  • 2014-03-22
  • 1970-01-01
  • 1970-01-01
  • 2014-02-07
  • 2017-07-01
  • 2018-06-17
  • 1970-01-01
  • 1970-01-01
  • 2020-05-22
相关资源
最近更新 更多