Масштабирование разбросанного графика некорректно работает в d3.js

Я пытаюсь создать диаграмму рассеяния с увеличением. Следующий код, который я использовал в своем приложении angular, работает до определенной степени, когда я запускаю его на своем локальном сервере. Однако, помещая тот же код в Stackblitz, масштабирование не работает. Я хочу добиться масштабирования, при котором масштабирование ограничивается только значениями на графике. Масштаб оси не должен быть, примите изменения значений по обеим осям. Что-то вроде: http://bl.ocks.org/peterssonjonas/4a0e7cb8d23231243e0e.

Здесь, в примере, при масштабировании увеличиваются только значения и соответственно изменяются значения оси. Он не увеличивает всю область построения графика. Как мне этого добиться? Вот мой код Stackblitz: https://stackblitz.com/edit/angular-hu2thj

ОТВЕЧАТЬ : Наконец, я выясняю график этой проблемы на случай, если в будущем возникнут какие-либо ссылки:

import { Component, OnInit, Input, ViewChild, ElementRef } from '@angular/core';
import * as d3 from 'd3';

@Component({
    selector: 'app-scatterplot',
    templateUrl: './scatterplot.component.html',
    styleUrls: ['./scatterplot.component.css']
})
export class ScatterplotComponent implements OnInit {
    @ViewChild('chart1') private chartContainer: ElementRef;
    dataValue = [{ x: "67", y: "188", },
    { x: "200", y: "163" },
    { x: "254", y: "241" },
    { x: "175", y: "241" },

    ];
    ngOnInit() {
        this.graph();
    }

    graph() {

        const element = this.chartContainer.nativeElement;
        var svgWidth = 400;
        var svgHeight = 400;

        var margin = { top: 30, right: 40, bottom: 50, left: 60 };

        var width = svgWidth - margin.left - margin.right;
        var height = svgHeight - margin.top - margin.bottom;

        var originalCircle = {
            "cx": -150,
            "cy": -15,
            "r": 20
        };


        var svgViewport = d3.select(element)
            .append('svg')
            .attr('width', svgWidth)
            .attr('height', svgHeight)

        // create scale objects
        var x = d3.scaleLinear()
            .domain([1, 500])
            .range([0, width]);

        var y = d3.scaleLinear()
            .domain([1, 500])
            .range([height, 0]);


        // create axis objects
        var xAxis = d3.axisBottom(x);
        var yAxis = d3.axisLeft(y);


        // Zoom Function
        var zoom = d3.zoom()
            .on("zoom", zoomFunction);



        // Inner Drawing Space
        var innerSpace = svgViewport.append("g")
            .attr("class", "inner_space")
            .attr("transform", "translate(" + margin.left + "," + margin.top + ")")
            .call(zoom);




        // append some dummy data
        var data = innerSpace.selectAll("circle")
            .data(this.dataValue)
            .enter().append("circle")
            .attr("class", "dot")
            .attr("cx", function (d) {
                return x(d.x)
                    ;
            })
            .attr("cy", function (d) {
                return y(d.y);
            })
            .attr("r", 2);

        // Draw Axis
        var gX = innerSpace.append("g")
            .attr("class", "axis")
            .attr("transform", "translate(0, " + height + ")")
            .call(xAxis);

        var gY = innerSpace.append("g")
            .attr("class", "axis axis--y")
            .call(yAxis);



        // append zoom area
        var view = innerSpace.append("rect")
            .attr("class", "zoom")
            .attr("width", width)
            .attr("height", height - 10)
            .attr("fill", "transparent")
            .attr("fill-opacity", 0.1)
            .call(zoom)

        function zoomFunction() {
            // create new scale ojects based on event
            var new_xScale = d3.event.transform.rescaleX(x)
            var new_yScale = d3.event.transform.rescaleY(y)
            console.info(d3.event.transform)

            // update axes
            gX.call(xAxis.scale(new_xScale));
            gY.call(yAxis.scale(new_yScale));

            // update circle
            data.attr("transform", d3.event.transform)
        };

    }
}

в моем браузере зум / перевод мертв, как дронт. stackoverflow.com/questions/51897596/…stackoverflow.com/questions/51562401/d3-slow-zoomable-heatma‌ p /…

rioV8 18.08.2018 20:50

Он работает в моем браузере, я не знаю как. Но в stackblitz это не отображается

Udit Gogoi 18.08.2018 20:52

@ rioV8 Я попробовал одно из решений по указанной вами ссылке, но оно увеличивает масштаб всего графика, который мне не нужен. Мне просто нужно увеличить график, содержащий значение. Обе оси не должны изменяться при масштабировании.

Udit Gogoi 18.08.2018 20:59

попробуйте код в моем ответе

rioV8 18.08.2018 21:12
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
4
629
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема с stackblitz в том, что d3.event - это null.

Попробуйте это, чтобы увеличить точки на вашем локальном сервере.

Вам нужно добавить путь клипа и анимировать ось, см. Второй пример (тепловая карта)

var svg = d3.select(element)
    .append("svg:svg")
    .attr("width", w + left_padding)
    .attr("height", h + top_padding);

var g = svg.append("g");
var zoom = d3.zoom().on("zoom", function () { 
        console.info("zoom", d3, d3.event);
        g.attr("transform", d3.event.transform);
    });

svg.call(zoom);

g.selectAll("circle")
    .data(this.dataValue)
    .enter().append("circle")
    .attr("class", "dot")
    .attr("cx", d => x(d.x) )
    .attr("cy", d => y(d.y) )
    .attr("r", 2);

при масштабировании точки графика выходят за пределы оси. Какой div мне нужно добавить свойство overflow: hidden?

Udit Gogoi 18.08.2018 21:20

Вместо этого используйте путь обрезки, чтобы определить разрешенную для отображения область - обычно в пределах размеров осей.

Ryan Morton 18.08.2018 21:26

@RyanMorton добавит часть клипа, достаточную для анимации оси. Должен ли я писать эту часть отдельно?

Udit Gogoi 18.08.2018 21:30

@UdG: посмотрите на пример карты кучи. вторая ссылка

rioV8 18.08.2018 21:36

@UdG: он у вас тоже работает на stackblitz? Сравните версии d3, которые вы используете локально и на stackblitz

rioV8 18.08.2018 23:58

Другие вопросы по теме