मेरी समाधान व्याख्या करने के लिए:
ध्यान दें कि 3 चरणों और क्योंकि आप तराजू उपयोग नहीं कर रहे सब कुछ आकर्षित करने के लिए 4 केवल आवश्यक हैं - एक बेहतर दृष्टिकोण प्रत्येक पंक्ति के लिए दो बिंदुओं को परिभाषित करना होगा क्योंकि तत्वों के लिए बाध्य डेटा और फिर स्केल को फिर से निकालने के लिए उपयोग करें। यह कोड को सरल बना देगा।
आपके दृष्टिकोण के साथ यह अभी भी संभव है। इसे सुविधाजनक बनाने के लिए, मैंने आपके कोड में कुछ संशोधन किए हैं - विशेष रूप से, मैंने अलग-अलग अनुवादों के साथ विभिन्न नेस्टेड g
तत्वों को साफ़ कर लिया है और लाइनों को उनके x1
, x2
, y1
, y2
गुणों के माध्यम से परिभाषित किया है कंटेनरों के अनुवाद के माध्यम से। इन दोनों परिवर्तनों में वह कार्यक्षमता है जिसे आप कार्यान्वित करना चाहते हैं क्योंकि केवल एक ही परिवर्तन उन स्थानों को लेता है जिन्हें कई अन्य परिवर्तनों पर विचार करने की आवश्यकता नहीं होती है। मैंने कई g
तत्वों में लाइनों को भी घोंसला दिया है ताकि उन्हें स्केल किया जा सके और अधिक आसानी से अनुवाद किया जा सके।
ब्रश हैंडलर समारोह अब इस तरह दिखता है:
// update scales, redraw axes
var extent = brush.extent();
x.domain(brush.empty() ? x2.domain() : [ extent[0][0], extent[1][0] ]);
y.domain(brush.empty() ? y2.domain() : [ extent[0][1], extent[1][1] ]);
xAxisG.call(xAxis);
yAxisG.call(yAxis);
इस कोड को काफी आत्म व्याख्यात्मक होना चाहिए - तराजू के डोमेन ब्रश की वर्तमान हद के अनुसार अपडेट किया जाता है और कुल्हाड़ियों दोबारा बनाई कर रहे हैं ।
// compute and apply scaling and transformation of the g elements containing the lines
var sx = (x2.domain()[1] - x2.domain()[0])/(x.domain()[1] - x.domain()[0]),
sy = (y2.domain()[1] - y2.domain()[0])/(y.domain()[1] - y.domain()[0]),
dx = -x2(x.domain()[0]) - x2.range()[0],
dy = -y2(y.domain()[1]) - y2.range()[1];
d3.selectAll("g.container")
.attr("transform", "translate(" + [sx * dx, sy * dy] + ")scale(" + [sx, sy] + ")");
यह मुश्किल हिस्सा है - तराजू के नए डोमेन के आधार पर, हम लाइनों के लिए पैमाने पर और अनुवाद गणना करने के लिए की जरूरत है। स्केलिंग कारक केवल पुरानी सीमा का अनुपात नई सीमा तक हैं (ध्यान दें कि मैंने उन तराजू की प्रतियां बनाई हैं जो संशोधित नहीं हैं), यानी 1 से अधिक संख्या। अनुवाद (0,0) की शिफ्ट निर्धारित करता है पुराने (0,0) समन्वय के अंतर के माध्यम से समन्वय और गणना की जाती है (मुझे मूल स्केल की सीमा से यह मिलता है) और मूल स्केल के अनुसार नए डोमेन मूल की स्थिति।
एक ही समय में अनुवाद और स्केल लागू करते समय, हमें स्केलिंग कारकों के साथ ऑफ़सेट को गुणा करने की आवश्यकता है।
// reset brush
brush.clear();
d3.select(".brush").call(brush);
अंत में, हम ब्रश को साफ़ करते हैं और भूरे रंग के आयत से छुटकारा पाने के लिए इसे रीसेट करते हैं।
पूर्ण डेमो here।
क्या आप [एसई प्रतिष्ठा ग्राफ] (http://stackexchange.com/users/4536689/d3-gxt-java?tab=reputation) के समान नए ज़ूम किए गए दृश्य के साथ मौजूदा चार्ट को ओवरराइट करना चाहते हैं? – approxiblue
हां - मैं उदाहरण में दिखाए गए जैसा बिल्कुल ओवरराइट करना चाहता हूं। – somename
उदाहरण में आपने रोटेशन 30,45,60 का उपयोग करके लाइनें बनाई हैं ... क्या यह असली डेटासेट है, या आपके पास कुछ वास्तविक एक्स (दिनांक) और वाई (पॉइंट) मान हैं जैसे http://stackexchange.com/उपयोगकर्ता/4536689/d3-gxt-java? tab = प्रतिष्ठा – Cyril