तेज़ और उत्तरदायी इंटरेक्टिव चार्ट / ग्राफ़: एसवीजी, कैनवस, अन्य?


114

मैं एक ऐसी परियोजना को अद्यतन करने के लिए उपयोग करने के लिए सही तकनीक का चयन करने की कोशिश कर रहा हूं जो मूल रूप से एक ज़ूम करने योग्य, pannable ग्राफ में हजारों अंकों का प्रतिपादन करती है। वर्तमान कार्यान्वयन, प्रोटोविस का उपयोग करते हुए, अंडरपरफॉर्मेंट है। यहां इसकी जांच कीजिए:

http://www.planethunters.org/classify

पूरी तरह से ज़ूम आउट होने पर लगभग 2000 बिंदु हैं। थोड़ा सा ज़ूम करने के लिए नीचे के हैंडल का उपयोग करने का प्रयास करें, और इसे चारों ओर पैन करने के लिए खींचें। आप देखेंगे कि यह काफी तड़का हुआ है और आपके सीपीयू का उपयोग संभवतः एक कोर पर 100% तक हो जाता है जब तक कि आपके पास वास्तव में तेज कंप्यूटर न हो। फ़ोकस क्षेत्र में प्रत्येक परिवर्तन प्रोटॉविस के लिए एक रिड्रा कहता है जो बहुत धीमा है और अधिक बिंदुओं के साथ खराब है।

मैं इंटरफ़ेस के लिए कुछ अपडेट करना चाहूंगा और साथ ही एनीमेशन और इंटरैक्शन के साथ अधिक संवेदनशील होने के लिए अंतर्निहित विज़ुअलाइज़ेशन तकनीक को बदलूंगा। निम्नलिखित लेख से, ऐसा लगता है कि पसंद एक और एसवीजी-आधारित पुस्तकालय, या एक कैनवास-आधारित के बीच है:

http://www.sitepoint.com/how-to-choose-between-canvas-and-svg/

d3.js , जो कि प्रोटॉविस से बढ़ा था, एसवीजी-आधारित है और इसे एनिमेशन प्रदान करने में बेहतर माना जाता है । हालांकि, मैं कितना बेहतर है और इसकी परफॉरमेंस सीलिंग क्या है, इसके बारे में संदिग्ध हूं। इस कारण से, मैं काइनेटिकजस जैसे एक कैनवास-आधारित पुस्तकालय का उपयोग करके अधिक पूर्ण ओवरहाल पर भी विचार कर रहा हूं । हालांकि, इससे पहले कि मैं एक दृष्टिकोण या किसी अन्य का उपयोग करने में बहुत दूर हो जाऊं, मैं किसी ऐसे व्यक्ति से सुनना चाहता हूं जिसने इस डेटा के साथ एक समान वेब एप्लिकेशन किया है और उनकी राय ले।

सबसे महत्वपूर्ण बात प्रदर्शन है, अन्य बातचीत सुविधाओं को जोड़ने और एनीमेशन प्रोग्रामिंग में आसानी पर एक माध्यमिक ध्यान देने के साथ। संभवतः एक बार में 2000 से अधिक अंक नहीं होंगे, जिनमें से प्रत्येक पर एक छोटी सी त्रुटि सलाखों के साथ होगी। ज़ूम इन, आउट और पैनिंग को सुचारू करने की आवश्यकता है। यदि सबसे हाल ही में एसवीजी पुस्तकालय इस पर सभ्य हैं, तो शायद डी 3 का उपयोग करने में आसानी से काइनेटिकजस आदि के लिए बढ़े हुए सेटअप से आगे निकल जाएंगे, लेकिन अगर कैनवास का उपयोग करने के लिए एक बड़ा प्रदर्शन लाभ है, खासकर धीमे कंप्यूटर वाले लोगों के लिए, तो मैं निश्चित रूप से इस तरह जाना पसंद करेंगे।

SVG का उपयोग करने वाले NYTimes द्वारा किए गए ऐप का उदाहरण, लेकिन अभी भी आसानी से स्वीकार करता है: http://www.nytimes.com/interactive/2012/05/17/business/dealbook/how-the-facebook-offering-compares.html । अगर मुझे वह प्रदर्शन मिल सकता है और मुझे अपना खुद का कैनवास ड्राइंग कोड नहीं लिखना है, तो मैं शायद एसवीजी के लिए जाऊंगा।

मैंने देखा कि कुछ उपयोगकर्ताओं ने कैनवास रेंडरिंग के साथ संयुक्त d3.js हेरफेर के एक संकर का उपयोग किया है । हालाँकि, मैं इस ऑनलाइन के बारे में अधिक दस्तावेज नहीं ढूँढ सकता या उस पोस्ट के ओपी के संपर्क में नहीं आ सकता। अगर किसी को इस तरह के DOM-to-कैनवास ( डेमो , कोड ) कार्यान्वयन करने का कोई अनुभव है , तो मैं आपसे भी सुनना चाहूंगा। यह डेटा में हेरफेर करने और इसे (और इसलिए प्रदर्शन) कैसे रेंडर करने के लिए कस्टम नियंत्रण होने में सक्षम होने का एक अच्छा संकर प्रतीत होता है, लेकिन मुझे लगता है कि अगर डोम में सब कुछ लोड करने के लिए अभी भी चीजों को धीमा करने जा रहा है।

मुझे पता है कि कुछ मौजूदा सवाल हैं जो इस एक के समान हैं, लेकिन उनमें से कोई भी एक ही बात नहीं पूछता है। आपकी सहायता के लिए धन्यवाद।

अनुवर्ती : मैं जिस कार्यान्वयन का उपयोग कर रहा था वह https://github.com/zooniverse/LightCurves पर है


"सबसे महत्वपूर्ण बात प्रदर्शन है, अन्य बातचीत को जोड़ने में आसानी पर एक माध्यमिक फोकस के साथ" +1 कैनवस के लिए
फिलिप सिप

सवाल यह है कि क्या एसवीजी 2k अंक + अन्य चार्ट तत्वों के लिए अधिकांश ब्राउज़रों पर पर्याप्त है? यदि ऐसा है, और धीमापन सिर्फ प्रोटोविस में कमजोरियों के कारण है, तो मैं एसवीजी के साथ रहना चाहूंगा।
एंड्रयू माओ

1
माइक बोस्सॉक अल्रेड ने एक अच्छा जवाब दिया। कुछ अतिरिक्त जानकारी के लिए आप इन दो संसाधनों की जांच कर सकते हैं: stackoverflow.com/questions/5882716/html5-canvas-vs-svg-vs-div/… blogs.msdn.com/b/ie-archive/2011/04/22 / ...
Ümit

8
अनुवर्ती: मैंने इसे हाइब्रिड एसवीजी / कैनवास दृष्टिकोण के साथ लागू किया है, जहां एसवीजी कुल्हाड़ियों और ग्रिडलाइन्स का ख्याल रखता है और कैनवास डॉट्स को अत्यधिक तेजी से प्रस्तुत कर सकता है। यह सुपर फास्ट है!
एंड्रयू माओ

जवाबों:


183

सौभाग्य से, 2000 मंडलियां खींचना परीक्षण करने के लिए एक बहुत आसान उदाहरण है। इसलिए यहां चार संभावित कार्यान्वयन हैं, जिनमें से प्रत्येक कैनवस और एसवीजी में से दो हैं:

ये उदाहरण ज़ूमिंग और पैनिंग को लागू करने के लिए डी 3 के ज़ूम व्यवहार का उपयोग करते हैं । कैनवस या एसवीजी में सर्किल प्रदान किए जाने के अलावा, अन्य प्रमुख अंतर यह है कि क्या आप ज्यामितीय या सिमेंटिक जूमिंग का उपयोग करते हैं ।

जियोमेट्रिक जूमिंग का मतलब है कि आप पूरे व्यूपोर्ट में एक ही ट्रांसफॉर्मेशन लागू करते हैं: जब आप ज़ूम इन करते हैं, तो सर्किल बड़े हो जाते हैं। इसके विपरीत अर्थपूर्ण ज़ूमिंग का अर्थ है कि आप प्रत्येक सर्कल में व्यक्तिगत रूप से ट्रांसफ़ॉर्म लागू करते हैं: जब आप ज़ूम इन करते हैं, तो सर्कल समान आकार के रहते हैं, लेकिन वे फैल जाते हैं। Planethunters.org वर्तमान में सिमेंटिक जूमिंग का उपयोग करता है, लेकिन अन्य मामलों पर विचार करने के लिए यह उपयोगी हो सकता है।

जियोमेट्रिक जूमिंग कार्यान्वयन को सरल करता है: आप एक बार अनुवाद और पैमाने लागू करते हैं, और फिर सभी मंडलियों को फिर से प्रस्तुत किया जाता है। एसवीजी कार्यान्वयन विशेष रूप से सरल है, एक एकल "ट्रांसफॉर्म" विशेषता को अपडेट करता है। दोनों ज्यामितीय ज़ूमिंग उदाहरणों का प्रदर्शन पर्याप्त से अधिक लगता है। सिमेंटिक जूमिंग के लिए, आप देखेंगे कि डी 3 प्रोटॉविस की तुलना में काफी तेज है। ऐसा इसलिए है क्योंकि यह प्रत्येक ज़ूम ईवेंट के लिए बहुत कम काम कर रहा है। (प्रोटॉविस संस्करण में सभी तत्वों पर सभी विशेषताओं को पुनर्गणना करना है।) कैनवस-आधारित सिमेंटिक जूमिंग एसवीजी की तुलना में थोड़ा अधिक है, लेकिन एसवीजी सिमेंटिक जूमिंग अभी भी उत्तरदायी लगता है।

फिर भी प्रदर्शन के लिए कोई जादू की गोली नहीं है, और ये चार संभव दृष्टिकोण संभावनाओं के पूर्ण स्थान को कवर करना शुरू नहीं करते हैं। उदाहरण के लिए, आप पैनिंग के लिए ज्यामितीय दृष्टिकोण ("परिवर्तन" विशेषता को अपडेट करते हुए) और जूमिंग के दौरान केवल व्यक्तिगत हलकों को फिर से परिभाषित करके ज्यामितीय और सिमेंटिक जूमिंग को जोड़ सकते हैं। आप शायद इनमें से एक या एक से अधिक तकनीकों को जोड़ सकते हैं CSS3 के साथ कुछ हार्डवेयर त्वरण को जोड़ने के लिए रूपांतरित करता है (जैसा कि पदानुक्रमित किनारे बंडलिंग उदाहरण में ), हालांकि इसे लागू करने के लिए मुश्किल हो सकता है और दृश्य कलाकृतियों को पेश कर सकता है।

फिर भी, मेरी व्यक्तिगत प्राथमिकता एसवीजी में यथासंभव रखना है, और केवल "इनर लूप" के लिए कैनवस का उपयोग करना है जब रेंडरिंग टोंटी है । एसवीजी में विकास के लिए बहुत सारी उपयुक्तताएं हैं - जैसे कि सीएसएस, डेटा-जॉइन्ट्स और एलिमेंट इंस्पेक्टर - कि कैनवस के साथ शुरू करने के लिए अक्सर समय से पहले अनुकूलन होता है। एसवीजी के साथ कैनवस को मिलाते हुए, जैसा कि फेसबुक आईपीओ विज़ुअलाइज़ेशन से जुड़ा हुआ है, इन सभी में से अधिकांश को बनाए रखने का एक लचीला तरीका है, जबकि अभी भी सबसे अच्छा प्रदर्शन है। मैंने इस तकनीक का उपयोग क्यूबिज़्म.जेएस में भी किया था , जहां टाइम-सीरीज़ विज़ुअलाइज़ेशन का विशेष मामला खुद को बिटमैप कैशिंग के लिए अच्छी तरह से उधार देता है।

जैसा कि इन उदाहरणों से पता चलता है, आप कैनवस के साथ डी 3 का उपयोग कर सकते हैं, भले ही डी 3 के कुछ हिस्से एसवीजी-विशिष्ट हैं। यह बल-निर्देशित ग्राफ और इस टक्कर का पता लगाने का उदाहरण भी देखें ।


वाह, यह एक भयानक जवाब था, और खुद को कल्पना के मास्टर से! मुझे लगता है कि मुझे सिमेंटिक जूमिंग के साथ रहना होगा, और मेरे कंप्यूटर पर, कैनवास-आधारित रेंडरर एसवीजी संस्करण की तुलना में तेज़ है जब पैनिंग / जूमिंग (ब्राउज़र कार्यान्वयन के साथ करना पड़ सकता है?)। एसवीजी को कैनवस के साथ प्रयोग करने के बारे में आपने जो कहा, वह वही है जो मैं पुष्टि करना चाहता था, और कोड उदाहरण सिर्फ एक मीठा बोनस है। बहुत बहुत धन्यवाद!
एंड्रयू माओ

बस अलग-अलग ब्राउज़रों पर सिमेंटिक जूमिंग उदाहरणों को आज़माने के लिए सोचा था: क्रोम, दोनों बहुत तेज, मैं अंतर नहीं बता सकता; IE: एसवीजी थोड़ा धीमा; फ़ायरफ़ॉक्स (अंतिम टिप्पणी): SVG कैनवास की तुलना में धीमा है। मुझे लगता है कि निर्णय को थोड़ा जटिल करता है, लेकिन कैनवास को एक सुरक्षित विकल्प प्रदान करता है। एक और सवाल: क्या कैनवास के बजाय काइनेटिकज का उपयोग सीधे प्रदर्शन को काफी प्रभावित करने वाला है?
एंड्रयू माओ

1
एंड्रयू, थोड़ी देर से लेकिन यहाँ एफएफ के साथ मेरा अनुभव है: यह पकड़ रहा है। मैं एफएफ 15 चलाता था और डी 3 एसवीजी संक्रमण जल्दी धीमा होने लगा। लेकिन प्रत्येक नए संस्करण में काफी तेजी आई। अब मैं एफएफ 18 बीटा पर हूं और यह 17 की तुलना में तेज है। यकीन नहीं है कि यह क्रोम की तरह चिकनी है।
user2503795

@AndrewMao हाय एंड्रयू, मैं एक ऐसी स्थिति में दौड़ता हूं जहां ऐसा लगता है कि रेंडरिंग अड़चन है। मुझे कुछ बिंदुओं और लगभग 6000 वक्र पथ को पैन और ज़ूम करने की आवश्यकता है। stackoverflow.com/questions/17907769/svg-path-rendering-speed/… लेकिन मैं बोस्कॉक को तब तक नहीं समझ पाया जब उसने कहा "जितना संभव हो उतना SVG में रखें, और केवल" इनर लूप "के लिए कैनवस का उपयोग करें" मेरे पास है हालांकि चार उदाहरणों को देखा .. क्या आप मुझे कुछ प्रकाश डाल सकते हैं?
काकासी

@kakacii सभी ब्राउज़रों में समान रूप से धीमा परिवर्तन है? यदि ऐसा है, तो मैं कहूंगा कि या तो आप गलत कोड का उपयोग कर रहे हैं या आपने ब्राउज़र रेंडरिंग की सीमा को मारा है। यदि आप कुछ कोड पोस्ट कर सकते हैं तो मैं मदद करने में सक्षम हो सकता हूं। mbostock केवल कोड के लिए अधिक जटिल होने के बाद से आवश्यक हेरफेर और कैनवास की सादगी के लिए एसवीजी का उपयोग करने की बात कर रहा था। हालांकि काइनेटिकज जैसे पुस्तकालयों को कुछ हद तक सरल बनाया गया है।
एंड्रयू माओ

8

मुझे लगता है कि आपके मामले में कैनवस और एसवीजी के बीच का निर्णय »घोड़े की सवारी करने« या "पोर्श" चलाने के बीच के निर्णय जैसा नहीं है। मेरे लिए यह कारों के रंग के बारे में निर्णय जैसा है।

मुझे समझाने दो: यह मानते हुए कि संचालन के ढांचे के आधार पर

  • एक सितारा खींचो,
  • एक तारा और जोड़ें
  • एक सितारा निकालें

रैखिक समय लें। इसलिए, यदि आपके ढांचे का निर्णय अच्छा था, तो यह थोड़ा तेज है, अन्यथा थोड़ा धीमा है।

यदि आप यह मानकर चलते हैं कि ढांचा सिर्फ तेज है, तो यह पूरी तरह से स्पष्ट हो जाता है कि प्रदर्शन की कमी सितारों की उच्च मात्रा के कारण होती है और उन्हें संभालना कुछ ऐसा है जो फ्रेमवर्क में से कोई भी आपके लिए नहीं कर सकता है, कम से कम मुझे नहीं पता है इसके बारे में।

मैं जो कहना चाहता हूं, वह यह है कि समस्या का आधार कम्प्यूटेशनल ज्यामिति की एक बुनियादी समस्या की ओर जाता है, अर्थात्: श्रेणी खोज और कंप्यूटर ग्राफिक्स का एक और: विस्तार का स्तर

अपने प्रदर्शन की समस्या को हल करने के लिए आपको एक अच्छा प्रीप्रोसेसर लागू करने की आवश्यकता होती है जो बहुत तेज़ी से खोजने में सक्षम होता है जो सितारों को प्रदर्शित करने में सक्षम होता है और संभवतः उन सितारों को क्लस्टर करने में सक्षम होता है जो ज़ूम के आधार पर एक साथ बंद होते हैं। केवल एक चीज जो आपके विचार को ज्वलंत और तेज रखती है, सितारों की संख्या को कम से कम आकर्षित करने के लिए रख रही है।

जैसा कि आपने कहा, कि सबसे महत्वपूर्ण बात यह है कि मैं कैनवस का उपयोग करना चाहूंगा, क्योंकि यह बिना डोम संचालन के काम करता है। यह वेबजीएल का उपयोग करने का अवसर भी प्रदान करता है, जो ग्राफिक प्रदर्शन को बहुत बढ़ाता है।

BTW: क्या आपने पेपर की जांच की है । यह कैनवास का उपयोग करता है, लेकिन वेक्टर ग्राफिक्स का अनुकरण करता है।

PS: इस पुस्तक में आप वेब पर ग्राफिक्स, प्रौद्योगिकियों, पेशेवरों और कैनवस, SVG और DHTML के बारे में बहुत विस्तृत चर्चा पा सकते हैं।


7

मैंने हाल ही में एक निकट-रीयल-टाइम डैशबोर्ड पर काम किया है (हर 5 सेकंड में ताज़ा करें) और कैनवास का उपयोग करने वाले चार्ट का उपयोग करने के लिए चुना।

हमने हाईचर्स (SVG आधारित जावास्क्रिप्ट चार्टिंग लाइब्रेरी) और कैनवसजेएस (कैनवास आधारित जावास्क्रिप्ट चार्टिंग लाइब्रेरी) की कोशिश की। हालांकि हाईचर्ट एक शानदार चार्टिंग एपीआई है और हम कैनवस जेएस का उपयोग करने के लिए और अधिक सुविधाएँ प्रदान करते हैं।

हमें प्रति चार्ट में कम से कम 15 मिनट का डेटा प्रदर्शित करने की आवश्यकता थी (अधिकतम दो घंटे की सीमा के विकल्प के साथ)।

तो 15 मिनट के लिए: 900 अंक (प्रति सेकंड डेटा बिंदु) x2 (लाइन और बार संयोजन चार्ट) x4 चार्ट = 7200 अंक कुल।

CanvasJS के साथ क्रोम प्रोफाइलर का उपयोग करते हुए, मेमोरी कभी भी 30MB से ऊपर नहीं गई, जबकि Highcharts मेमोरी उपयोग 600MB से अधिक था।

इसके अलावा 5 सेकंड के ताज़ा समय के साथ कैनवस जेएस रेंडरिंग अधिक संवेदनशील और फिर हाईचर्ट्स आवंटित किया गया था।

हमने एक टाइमर (सेटइंटरवल 5 सेकंड) का इस्तेमाल किया, जो कि बैकस्ट सर्वर से डेटा खींचने के लिए 4 REST API कॉल करता है, जो एलिटिक्स खोज से जुड़ा था। डेटा के रूप में अपडेट किया गया प्रत्येक चार्ट JQuery.post () द्वारा प्राप्त किया जाता है।

कहा कि ऑफ़लाइन रिपोर्टों के लिए मैं अपने अधिक लचीले एपीआई के बाद से Highcharts के साथ जाऊंगा।

ज़िंग चार्ट भी हैं जो एसवीजी या कैनवस का उपयोग करने का दावा करते हैं, लेकिन उन्हें नहीं देखा है।

जब प्रदर्शन वास्तव में महत्वपूर्ण हो तो कैनवस पर विचार किया जाना चाहिए। लचीलेपन के लिए एस.वी.जी. ऐसा नहीं है कि कैनवस फ्रेमवर्क लचीले नहीं हैं, लेकिन यह एसवीजी फ्रेमवर्क के समान कार्यक्षमता प्राप्त करने के लिए कैनवास फ्रेमवर्क के लिए अधिक काम आवंटित करता है।



0

मैंने यह भी पाया कि जब हम एसवीजी ग्राफिक्स के साथ एक पेज को पीडीएफ में प्रिंट करते हैं, तो परिणामी पीडीएफ में अभी भी एक वेक्टर-आधारित छवि होती है, जबकि यदि आप कैनवस ग्राफिक्स के साथ एक पेज प्रिंट करते हैं, तो परिणामस्वरूप पीडीएफ फाइल में छवि को विघटित किया जाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.