跳到主要內容

精選文章

【公開聲明】關於近期網路特定言論與個資洩漏事件的說明

大家好,我是江舜智(紅色死神)。 近期有許多長期關注我的朋友、學生以及合作夥伴向我反映,網路上有特定人士(Threads 帳號 @drama.note)持續在各類與事件無直接關聯的討論串、課程資訊以及公開貼文下方留言,並引導他人前往我的個人網站與公開平台,同時以負面標籤及特定敘事方式討論我個人。 由於相關行為已持續相當長一段時間,甚至延伸至現實生活層面,對我的合作單位、教學夥伴以及部分學生造成困擾與壓力,我對此感到遺憾,也對受到影響的朋友們表達歉意。 因此,我希望藉此機會向所有關心此事的朋友,說明我的立場與態度。 一、關於事件本身:理性討論永遠受到歡迎 多年來,不論是在軟體開發、網頁前端教學領域,或是經營「Uniform Map 制服地圖」、進行攝影創作與分享個人觀點時,我始終相信公開透明與理性交流的重要性。 我並非完美的人,任何人都可能有思慮不周或與他人意見不同的時候。過去關於網站經營模式與相關議題,網路上確實出現過不少討論與質疑,而相關事項也曾進入司法程序接受調查。 經檢察機關完整調查後,最終依法作出不起訴處分,案件已告確定。 這代表相關指控經過司法審查後,並未認定存在違法情事。即使如此,我仍然願意以開放的態度面對外界意見。 如果有人對於我的教學內容、網站運作方式,或任何公開言論抱持不同看法,我始終歡迎在尊重彼此的前提下進行公開且理性的討論。 若有任何值得檢討與改進之處,我也願意虛心接受建設性的批評與建議。 二、關於持續性的騷擾行為:應以事實與法律為依據 我認為理性討論與持續性騷擾之間,存在明確界線。 近一年來,特定人士的部分行為已不再只是針對議題提出意見,而是逐漸演變成持續性的人身攻擊與現實層面的干擾,包括: • 在與事件無直接關聯的課程公告、教學資訊及各類公開討論串中,反覆張貼我的個人資訊與相關內容。 • 主動聯繫我的合作單位與工作相關機構,對其施加壓力或進行干擾。 • 在司法程序進行期間及收到相關通知後,仍持續以指名道姓方式發布涉及人格評價與攻擊性的言論。 我尊重每個人表達意見與監督公共議題的權利,但我同樣認為,任何討論都應建立在事實基礎上,並尊重法律程序與他人的基本權益。 無論支持或反對我的人,都有權自行查閱公開資訊、了解案件經過並形成自己的判斷,而不是透過片面標籤或情緒性指控來取代事實。 三、我的處理方式 對於相關爭議,我始終選擇透過法律與制度來處理,...

[D3.js] 長條圖



最近在研究 D3.js,他主要是用 svg 來製作可以互動的圖表,網站上有很多範例可以參考,懂得基本的運作原理外其實就有很多圖表可以應用,要能夠自己做出各種很炫的圖表的話就需要花一些時間去研究就是了。

直接用範例說明

  1. //Width and height   
  2. var w = 600;   
  3. var h = 250;   
  4. //資料   
  5. var dataset = [ 5, 10, 13, 19, 21, 25, 22, 18, 15, 13,   
  6.                 11, 12, 15, 20, 18, 17, 16, 18, 23, 25 ];   
  7.   
  8. var xScale = d3.scale.ordinal()   
  9.                 .domain(d3.range(dataset.length))   
  10.                 .rangeRoundBands([0, w], 0.05);   
  11.   
  12. var yScale = d3.scale.linear()   
  13.                 .domain([0, d3.max(dataset)])   
  14.                 .range([0, h]);   
  15.   
  16. //產生 SVG 物件   
  17. var svg = d3.select("body")   
  18.             .append("svg")   
  19.             .attr("width", w)   
  20.             .attr("height", h);   
  21.   
  22. //產生長條途   
  23. svg.selectAll("rect")   
  24.    .data(dataset) //讀入資料   
  25.    .enter()   
  26.    .append("rect")   
  27.    .attr("x"function(d, i) {   
  28.         return xScale(i);   
  29.    })   
  30.    .attr("y"function(d) {   
  31.         //預設原點是左上角, 需要靠高度減掉y座標長條圖才會由下往上長   
  32.         return h - yScale(d);    
  33.    })   
  34.    .attr("width", xScale.rangeBand())   
  35.    .attr("height"function(d) {   
  36.         return yScale(d);   
  37.    })   
  38.    .attr("fill"function(d) {   
  39.         return "rgb(0, 0, " + (d * 10) + ")";   
  40.    })   
  41.    .on("click"function(d) {   
  42.         console.log(d);   
  43.    });   
  44.   
  45. //Create labels   
  46. svg.selectAll("text")   
  47.    .data(dataset)   
  48.    .enter()   
  49.    .append("text")   
  50.    .text(function(d) {   
  51.         return d;   
  52.    })   
  53.    .attr("text-anchor""middle"//設定文字格式   
  54.    .attr("x"function(d, i) {   
  55.         return xScale(i) + xScale.rangeBand() / 2;   
  56.    })   
  57.    .attr("y"function(d) {   
  58.         return h - yScale(d) + 14;   
  59.    })   
  60.    .attr("font-family""sans-serif")   
  61.    .attr("font-size""11px")   
  62.    .attr("fill""white");   


加一些互動

  1. //Width and height   
  2.             var w = 600;   
  3.             var h = 250;   
  4.                
  5.             var dataset = [ 5, 10, 13, 19, 21, 25, 22, 18, 15, 13,   
  6.                             11, 12, 15, 20, 18, 17, 16, 18, 23, 25 ];   
  7.   
  8.             var xScale = d3.scale.ordinal()   
  9.                             .domain(d3.range(dataset.length))   
  10.                             .rangeRoundBands([0, w], 0.05);   
  11.   
  12.             var yScale = d3.scale.linear()   
  13.                             .domain([0, d3.max(dataset)])   
  14.                             .range([0, h]);   
  15.                
  16.             //Create SVG element   
  17.             var svg = d3.select("body")   
  18.                         .append("svg")   
  19.                         .attr("width", w)   
  20.                         .attr("height", h);   
  21.   
  22.             //Create bars   
  23.             svg.selectAll("rect")   
  24.                .data(dataset)   
  25.                .enter()   
  26.                .append("rect")   
  27.                .attr("x"function(d, i) {   
  28.                     return xScale(i);   
  29.                })   
  30.                .attr("y"function(d) {   
  31.                     return h - yScale(d);   
  32.                })   
  33.                .attr("width", xScale.rangeBand())   
  34.                .attr("height"function(d) {   
  35.                     return yScale(d);   
  36.                })   
  37.                .attr("fill"function(d) {   
  38.                     return "rgb(0, 0, " + (d * 10) + ")";   
  39.                })   
  40.                .on("mouseover"function(d) {   
  41.   
  42.                     //Get this bar's x/y values, then augment for the tooltip   
  43.                     var xPosition = parseFloat(d3.select(this).attr("x")) + xScale.rangeBand() / 2;   
  44.                     var yPosition = parseFloat(d3.select(this).attr("y")) / 2 + h / 2;   
  45.   
  46.                     //Update the tooltip position and value   
  47.                     d3.select("#tooltip")   
  48.                         .style("left", xPosition + "px")   
  49.                         .style("top", yPosition + "px")                        
  50.                         .select("#value")   
  51.                         .text(d);   
  52.                   
  53.                     //Show the tooltip   
  54.                     d3.select("#tooltip").classed("hidden"false);   
  55.   
  56.                })   
  57.                .on("mouseout"function() {   
  58.                   
  59.                     //Hide the tooltip   
  60.                     d3.select("#tooltip").classed("hidden"true);   
  61.                        
  62.                })   
  63.                .on("click"function() {   
  64.                     sortBars();   
  65.                });   
  66.   
  67.             //Define sort order flag   
  68.             var sortOrder = false;   
  69.                
  70.             //Define sort function   
  71.             var sortBars = function() {   
  72.   
  73.                 //Flip value of sortOrder   
  74.                 sortOrder = !sortOrder;   
  75.   
  76.                 svg.selectAll("rect")   
  77.                    .sort(function(a, b) {   
  78.                         if (sortOrder) {   
  79.                             return d3.ascending(a, b);   
  80.                         } else {   
  81.                             return d3.descending(a, b);   
  82.                         }   
  83.                     })   
  84.                    .transition()   
  85.                    .delay(function(d, i) {   
  86.                        return i * 50;   
  87.                    })   
  88.                    .duration(1000)   
  89.                    .attr("x"function(d, i) {   
  90.                         return xScale(i);   
  91.                    });   
  92.   
  93.             };    

留言

熱門文章