Я пытаюсь создать диаграмму рассеяния с увеличением. Следующий код, который я использовал в своем приложении 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)
};
}
}
Он работает в моем браузере, я не знаю как. Но в stackblitz это не отображается
@ rioV8 Я попробовал одно из решений по указанной вами ссылке, но оно увеличивает масштаб всего графика, который мне не нужен. Мне просто нужно увеличить график, содержащий значение. Обе оси не должны изменяться при масштабировании.
попробуйте код в моем ответе



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Проблема с 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?
Вместо этого используйте путь обрезки, чтобы определить разрешенную для отображения область - обычно в пределах размеров осей.
@RyanMorton добавит часть клипа, достаточную для анимации оси. Должен ли я писать эту часть отдельно?
@UdG: посмотрите на пример карты кучи. вторая ссылка
@UdG: он у вас тоже работает на stackblitz? Сравните версии d3, которые вы используете локально и на stackblitz
в моем браузере зум / перевод мертв, как дронт. stackoverflow.com/questions/51897596/…stackoverflow.com/questions/51562401/d3-slow-zoomable-heatma p /…