Кто-нибудь может направить меня с помощью визуализации, которую я пытаюсь собрать, используя js или python? - PullRequest
0 голосов
/ 30 января 2020

// set the dimensions and margins of the graph
var width = 460
var height = 460

// append the svg object to the body of the page
var svg = d3.select("#my_dataviz")
  .append("svg")
    .attr("width", width)
    .attr("height", height)

// Read data
d3.csv("https://raw.githubusercontent.com/holtzy/data_to_viz/master/Example_dataset/11_SevCatOneNumNestedOneObsPerGroup.csv", function(data) {

  // Filter a bit the data -> more than 1 million inhabitants
  data = data.filter(function(d){ return d.value>10000000 })

  // Color palette for continents?
  var color = d3.scaleOrdinal()
    .domain(["Asia", "Europe", "Africa", "Oceania", "Americas"])
    .range(d3.schemeSet1);

  // Size scale for countries
  var size = d3.scaleLinear()
    .domain([0, 1400000000])
    .range([7,55])  // circle will be between 7 and 55 px wide

  // create a tooltip
  var Tooltip = d3.select("#my_dataviz")
    .append("div")
    .style("opacity", 0)
    .attr("class", "tooltip")
    .style("background-color", "white")
    .style("border", "solid")
    .style("border-width", "2px")
    .style("border-radius", "5px")
    .style("padding", "5px")

  // Three function that change the tooltip when user hover / move / leave a cell
  var mouseover = function(d) {
    Tooltip
      .style("opacity", 1)
  }
  var mousemove = function(d) {
    Tooltip
      .html('<u>' + d.key + '</u>' + "<br>" + d.value + " inhabitants")
      .style("left", (d3.mouse(this)[0]+20) + "px")
      .style("top", (d3.mouse(this)[1]) + "px")
  }
  var mouseleave = function(d) {
    Tooltip
      .style("opacity", 0)
  }

  // Initialize the circle: all located at the center of the svg area
  var node = svg.append("g")
    .selectAll("circle")
    .data(data)
    .enter()
    .append("circle")
      .attr("class", "node")
      .attr("r", function(d){ return size(d.value)})
      .attr("cx", width / 2)
      .attr("cy", height / 2)
      .style("fill", function(d){ return color(d.region)})
      .style("fill-opacity", 0.8)
      .attr("stroke", "black")
      .style("stroke-width", 1)
      .on("mouseover", mouseover) // What to do when hovered
      .on("mousemove", mousemove)
      .on("mouseleave", mouseleave)
      .call(d3.drag() // call specific function when circle is dragged
           .on("start", dragstarted)
           .on("drag", dragged)
           .on("end", dragended));

  // Features of the forces applied to the nodes:
  var simulation = d3.forceSimulation()
      .force("center", d3.forceCenter().x(width / 2).y(height / 2)) // Attraction to the center of the svg area
      .force("charge", d3.forceManyBody().strength(.1)) // Nodes are attracted one each other of value is > 0
      .force("collide", d3.forceCollide().strength(.2).radius(function(d){ return (size(d.value)+3) }).iterations(1)) // Force that avoids circle overlapping

  // Apply these forces to the nodes and update their positions.
  // Once the force algorithm is happy with positions ('alpha' value is low enough), simulations will stop.
  simulation
      .nodes(data)
      .on("tick", function(d){
        node
            .attr("cx", function(d){ return d.x; })
            .attr("cy", function(d){ return d.y; })
      });

  // What happens when a circle is dragged?
  function dragstarted(d) {
    if (!d3.event.active) simulation.alphaTarget(.03).restart();
    d.fx = d.x;
    d.fy = d.y;
  }
  function dragged(d) {
    d.fx = d3.event.x;
    d.fy = d3.event.y;
  }
  function dragended(d) {
    if (!d3.event.active) simulation.alphaTarget(.03);
    d.fx = null;
    d.fy = null;
  }

})

</script>

Ссылка на эту визуализацию может быть найдена здесь: https://www.d3-graph-gallery.com/graph/circularpacking_template.html

Моя цель - установить эту визуализацию внутри отверстия кольцевой диаграммы. Я бесконечно искал в документации и поиске Google для python и js. Я хотел бы использовать реакцию с этим, потому что я думал, что это немного облегчило бы, или даже использовал python, но я думаю, что JS предлагает лучшие ресурсы для такой цели. Что мне нужно помочь, так это выяснить, как поместить эту визуализацию в отверстие в кольцевой диаграмме. Если у кого-то есть какая-либо информация, которая поможет мне выбрать правильный путь или быстрое объяснение, это будет с благодарностью Я ломаю голову здесь! Заранее спасибо.

1 Ответ

2 голосов
/ 30 января 2020

Я не уверен, что получил его, но постараюсь помочь.

Python имеет множество функций и очень универсален, и даже имеет некоторые библиотеки для визуализаций. Однако он ограничен типами графиков. С другой стороны, у вас есть Javascript, который имеет множество функций для веб-сайтов и дружественных сюжетов. Также вы можете настроить то, что вам нужно.

Я думаю, вам нужно подумать о том, какова основная цель ваших диаграмм и графиков. Если вам нужно что-то простое и объективное, Python будет лучшим выбором. Но если вам нужно что-то более «причудливое», настроенное, с анимацией и дружественным для обычных пользователей, лучше всего подойдет Javascript. Вы также можете найти тонны примеров кода в inte rnet, которые могут помочь вам в начале, даже с React.

Мой совет: используйте Python только для внутренней обработки данных и JS для визуализация.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...