2016-09-12 10 views
5

पर किंवदंतियों को जोड़ना मुझे पता है कि आप शायद स्वयं निर्मित ब्रैचर्ट सोच रहे हैं? मौजूदा पुस्तकालय क्यों नहीं? खैर मुझे कोड की 20000 लाइनों के साथ फ़ाइलों का उपयोग करने से नफरत है जबकि केवल 500 आवश्यक हैं।आत्मनिर्भर barchart

ओह और यह मजेदार है :) मुख्य उद्देश्य यह है कि मैं इस स्क्रिप्ट का उपयोग ऐसे ऐप के लिए करूँगा जो मैं फोनगैप का उपयोग करूँगा। तो आकार कम, बेहतर। enter image description here

मैं माता-पिता की ऊंचाई पर निर्भर सलाखों आकर्षित करने के लिए करने के लिए, सुनिश्चित करें कि वे समान चौड़ाई के कर रहे हैं सक्षम किया गया और उनकी ऊंचाई है है:

तो विचार निम्नलिखित प्राप्त करने के लिए है कंटेनर। जैसा कि आप नीचे दिए गए कोड में देखेंगे, मैंने विकल्पों में फ़ॉन्ट-आकार भी जोड़ा है। चूंकि कुछ चार्ट 300px की ऊंचाई का विस्तार करेंगे (उदाहरण के लिए डिफ़ॉल्ट 16px का उपयोग करेंगे)। और कुछ केवल 50 पीएक्स 12 या उससे कम के फ़ॉन्ट आकार के साथ। तो मुझे यकीन है कि शीर्ष के लिए पर्याप्त जगह (मात्रा) & नीचे (किंवदंतियों + शीर्षक)

अब मैं पूरी तरह से जोड़ने के बारे में यकीन नहीं है वहाँ है बनाने के लिए 3 x fontsize (+ बाकी) द्वारा बार ChartContainer कम और मात्रा को केन्द्रित करें। मैंने मौजूदा चार्ट पुस्तकालयों को खोजने की कोशिश की ताकि यह जांच सके कि यह सब कैसे प्रदान किया गया है, दुर्भाग्यवश वे सभी कैनवास या एसवीजी कंटेनर का उपयोग करते हैं। कोई सुझाव?

/* dataset 
 
    ------------------ 
 

 
    add legends 
 
    add result/amount 
 
    add bottom-border: 8px extra to both sides? 
 
    add chart name 
 

 
*/ 
 

 
(function ($) { 
 

 
    var methods = { 
 
     init : function(options) { 
 
      return this.each(function() { 
 

 
       var $this = $(this), 
 
        dataset = options.dataset, 
 
        fontSize = options.fontSize, 
 
        widthOfContainer = $this.width(), 
 
        heightOfContainer = $this.height() - (3 * (fontSize + 4)), // make room for title (bottom), legend (bottom), amounts (top) 
 
        widthOfBar = parseInt(widthOfContainer/options.dataset.length) - 2, 
 
        bar; 
 

 
       $this.bind('draw', function(e) { 
 
        $this.empty(); 
 

 
        var maxValueInDataset = Math.max.apply(Math, dataset.map(function(o){return o.a;})), 
 
         heightPerUnit = parseInt(heightOfContainer/maxValueInDataset); 
 
        for (var i = 0; i < dataset.length; i++) { 
 
         bar = $(document.createElement('div')); 
 
         bar.addClass('bar'); 
 
         bar.css({ 
 
          'height': parseInt(dataset[i].a * heightPerUnit) + 'px', 
 
          'width': parseInt(widthOfBar) + 'px', 
 
          'margin-left': parseInt(i * 2 + i * widthOfBar) + 'px', 
 
          'bottom': 2 * (fontSize + 4) 
 
         }); 
 
         $this.append(bar); 
 
        } 
 
       }); 
 

 
       $this.trigger('draw'); 
 
      }); 
 
     }, 
 
     draw : function(n) { 
 
      $(this).trigger('draw'); 
 
     } 
 
    }; 
 

 
    $.fn.chart = function(methodOrOptions) { 
 
     if (methods[methodOrOptions]) { 
 
      return methods[ methodOrOptions ].apply(this, Array.prototype.slice.call(arguments, 1)); 
 
     } else if (typeof methodOrOptions === 'object' || ! methodOrOptions) { 
 
      // Default to "init" 
 
      return methods.init.apply(this, arguments); 
 
     } else { 
 
      $.error('Method ' + methodOrOptions + ' does not exist on jQuery.tooltip'); 
 
     } 
 
    }; 
 

 
    $(document).ready(function(){ 
 
     $('div.barchart').chart({ 
 
      // Add font-size? 
 
      fontSize: 14, 
 
      name: 'mana cost', 
 
      dataset: [ 
 
       {a: 2, label: '0'}, 
 
       {a: 8, label: '1'}, 
 
       {a: 9, label: '2'}, 
 
       {a: 4, label: '3'}, 
 
       {a: 7, label: '4'}, 
 
       {a: 3, label: '5'}, 
 
       {a: 1, label: '6'}, 
 
       {a: 1, label: '7'}, 
 
       {a: 2, label: '8'}, 
 
       {a: 5, label: '9'} 
 
      ] 
 
     }); 
 
    }); 
 
}(jQuery));
/* Barchart 
 
    ========================================================================== */ 
 

 
.barchart { 
 
    color: black; 
 
} 
 

 
/* Bar 
 
    ========================================================================== */ 
 

 
.bar { 
 
    position: absolute; 
 
    height: 0px; 
 
    width: 0px; 
 
    margin-left: 0px; 
 
    bottom: 0px; 
 
    background: black; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div style="padding: 20px;"> 
 
      <div class="barchart" style="height: 100px; position: relative"></div> 
 
     </div>

उत्तर

2

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

/* dataset 
 
    ------------------ 
 

 
    add legends 
 
    add result/amount 
 
    add bottom-border: 8px extra to both sides? 
 
    add chart name 
 

 
*/ 
 

 
(function ($) { 
 

 
    var methods = { 
 
     init : function(options) { 
 
      return this.each(function() { 
 

 
       var $this = $(this), 
 
        dataset = options.dataset, 
 
        fontSize = options.fontSize, 
 
        legend = options.name, 
 
        widthOfContainer = $this.width(), 
 
        heightOfContainer = $this.height() - (3 * (fontSize + 4)), // make room for title (bottom), legend (bottom), amounts (top) 
 
        widthOfBar = parseInt(widthOfContainer/options.dataset.length) - 2, 
 
        widthOfBarPer = (widthOfBar/widthOfContainer) *100, 
 
        bar; 
 

 
       $this.bind('draw', function(e) { 
 
        $this.empty(); 
 

 
        var maxValueInDataset = Math.max.apply(Math, dataset.map(function(o){return o.a;})), 
 
         heightPerUnit = parseInt(heightOfContainer/maxValueInDataset); 
 
        for (var i = 0; i < dataset.length; i++) { 
 
        \t \t var dataVal = dataset[i].a; 
 
         bar = $(document.createElement('div')); 
 
         bar.addClass('bar'); 
 
         bar.css({ 
 
          'height': parseInt(dataVal * heightPerUnit) + 'px', 
 
          'width': widthOfBarPer + '%', // percentages to make more responsive? 
 
          'margin-left': (i + i * widthOfBarPer) + '%', // no need to parseInt as you have already on widthOfBar. now your chart stretches with the width . 
 
          'bottom': 2 * (fontSize + 4) 
 
         }); 
 
         bar.append('<p class="count">'+ i +'</p>'); \t // defines the bar count, this could be dataset[i].label but if you just use i then you don't need to type it out for each bar? 
 
         bar.append('<p class="value">'+ dataVal +'</p>'); \t // defines the bar value 
 
         $this.append(bar); // adds the bar count 
 
        } 
 
        var chartHeight = $this.height(); 
 
        $('.bar .count').css({ bottom: fontSize - chartHeight * 0.5 }); 
 
        $('.bar .value').css({ bottom: chartHeight * 0.5 - fontSize }); 
 
        if(legend){ 
 
\t \t \t \t \t \t \t \t \t \t \t \t legend = '<p class="legend">'+legend+'</p>'; 
 
\t \t \t \t \t \t \t \t \t \t \t $this.append(legend); 
 
        //  $this.css({ border: '1px solid #f90'}); // temp to see the current chart size 
 
         $this.find('.legend').css({ top: chartHeight - fontSize }); 
 
        } 
 
       }); 
 

 
       $this.trigger('draw'); 
 
      }); 
 
     }, 
 
     draw : function(n) { 
 
      $(this).trigger('draw'); 
 
     } 
 
    }; 
 

 
    $.fn.chart = function(methodOrOptions) { 
 
     if (methods[methodOrOptions]) { 
 
      return methods[ methodOrOptions ].apply(this, Array.prototype.slice.call(arguments, 1)); 
 
     } else if (typeof methodOrOptions === 'object' || ! methodOrOptions) { 
 
      // Default to "init" 
 
      return methods.init.apply(this, arguments); 
 
     } else { 
 
      $.error('Method ' + methodOrOptions + ' does not exist on jQuery.tooltip'); 
 
     } 
 
    }; 
 

 
    $(document).ready(function(){ 
 
     $('div.barchart').chart({ 
 
      // Add font-size? 
 
      fontSize: 14, 
 
      name: 'mana cost', 
 
      dataset: [ 
 
       {a: 2, label: '0'}, 
 
       {a: 8, label: '1'}, 
 
       {a: 9, label: '2'}, 
 
       {a: 4, label: '3'}, 
 
       {a: 7, label: '4'}, 
 
       {a: 3, label: '5'}, 
 
       {a: 1, label: '6'}, 
 
       {a: 1, label: '7'}, 
 
       {a: 2, label: '8'}, 
 
       {a: 5, label: '9'} 
 
      ] 
 
     }); 
 
    }); 
 
}(jQuery));
/* Barchart 
 
    ========================================================================== */ 
 

 
.barchart { 
 
    color: black; 
 
} 
 

 
/* Bar 
 
    ========================================================================== */ 
 

 
.bar { 
 
    position: absolute; 
 
    height: 0px; 
 
    width: 0px; 
 
    margin-left: 0px; 
 
    bottom: 0px; 
 
    background: black; 
 
} 
 

 
.count, .value{ 
 
    z-index: 7; 
 
    position: absolute; 
 
    text-align: center; 
 
    width: 100%; 
 
} 
 

 
.legend{ 
 
    position: relative; 
 
    text-align: center; 
 
    width: 100%; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div style="padding: 20px;"> 
 
      <div class="barchart" style="height: 100px; position: relative"></div> 
 
     </div>

2

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

आप बुनियादी संरचना से अपने barchart बनाने के लिए के रूप में एक <table> का उपयोग करते हैं, तो आप स्वरूपण विकल्प आप — कम कोड में जिसके परिणामस्वरूप चाहते करने के लिए आसान पहुँच जाते हैं:

  • एक मूल्यों के लिए पंक्ति, एक पंक्ति के लिए लेबल
  • बार प्रत्येक मूल्य सेल
  • पाठ तालिका कोशिकाओं के भीतर केंद्रित किया जा सकता है
  • कथा के लिए एक <caption> जोड़ा जा रहा है, जो ख केंद्रित है की border-bottom स्टाइल से बनाया जा सकता है y डिफ़ॉल्ट, और आसानी से तालिका के नीचे caption-side संपत्ति
  • vertical-align स्टाइलिंग सेल मानों की संपत्ति स्टाइल को सीधे सलाखों के ऊपर (नीचे डेमो में) या शीर्ष पर पंक्तिबद्ध करने की अनुमति देता है (जैसा कि आपके भीतर है चित्रण) — यह नीचे जेएस डेमो कोड में लाइन 20 में नियंत्रित है।

आखिरकार, एक बरचार्ट टैब्यूलर डेटा का एक विज़ुअलाइजेशन है, इसलिए तालिका का उपयोग करना समझ में आता है।

एक काम कर डेमो (वेनिला js के बारे में 30 लाइनों और सीएसएस, जो आप आसानी से अपने jQuery दृष्टिकोण के लिए अनुकूलित कर सकते हैं यदि आवश्यक हो की कुछ लाइनें में):

function barchart(containerId, options) { 
 
    var i, 
 
     html, 
 
     valueRow = '', 
 
     labelRow = '', 
 
     data = options.dataset, 
 
     maxBarHeight = 60, /* in px, could be set from options */ 
 
     barWidth = 20,  /* in px, could be set from options */ 
 
     maxValue = Math.max.apply(
 
     Math, 
 
     data.map(function(o) { 
 
      return o.a; 
 
     }) 
 
    ); 
 
    for(i = 0; i < data.length; i++){ 
 
    labelRow += '<td>' + data[i].label + '</td>'; 
 
    valueRow += '<td style="border-bottom:' + 
 
     (data[i].a * maxBarHeight/maxValue) + 
 
     'px solid black;vertical-align:' + 
 
     'bottom' + /* set to 'top' to get value labels lined up */ 
 
     ';width: ' + 
 
     barWidth + 'px">' + 
 
     data[i].a + '</td>'; 
 
    } 
 
    html = '<table class="barchart" ' + 
 
    'style="font-size:' + options.fontSize + 'px">' + 
 
    '<caption>' + options.name + '</caption>' + 
 
    '<tr>' + valueRow + '</tr>' + 
 
    '<tr>' + labelRow + '</tr>' + 
 
    '</table>'; 
 
    document.getElementById(containerId) 
 
    .innerHTML = html; 
 
} 
 

 
/* create a barchart */ 
 

 
barchart('testdiv', { 
 
    fontSize: 14, 
 
    name: 'mana cost', 
 
    dataset: [ 
 
    {a: 2, label: '0'}, 
 
    {a: 8, label: '1'}, 
 
    {a: 9, label: '2'}, 
 
    {a: 4, label: '3'}, 
 
    {a: 7, label: '4'}, 
 
    {a: 3, label: '5'}, 
 
    {a: 1, label: '6'}, 
 
    {a: 1, label: '7'}, 
 
    {a: 2, label: '8'}, 
 
    {a: 5, label: '9'} 
 
    ] 
 
});
.barchart td{ 
 
    text-align: center; 
 
} 
 

 
.barchart{ 
 
    font-family: 'arial narrow', sans-serif; 
 
    caption-side: bottom; 
 
}
<div id="testdiv"></div>

+0

यह 'isn एक जवाब का बुरा बुरा! धन्यवाद, इसे देखेंगे। – Goowik

संबंधित मुद्दे