本文へスキップ
からだにいいもの

Rのトピックスを中心に『まだ、まだ、知らない、役に立つ情報?』を発信します。

Rで解析:ggplot2の配色検討に使うと便利かも。簡単webツールの紹介

ggplot2の配色検討が簡単にできるwebツールを作成しました。離散変数と連続変数に対応。テーマ設定、色覚確認が可能。目的とするRコードの表示と保存が可能です。

迷いがちな、図の配色検討の役に立てばと思います。

コマンド例の動作は「ggplot2」パッケージの 3.5.1で確認しています。

ggplot2の配色検討ツール

クリックで簡単に操作可能です。使い方をクリックすると、説明が表示されます。

パレットとラベルの設定

プレビュー

コマンド例


        
`; // === JavaScript ロジック部 === (function(){ "use strict"; /* ---------- colormaps ---------- */ var COLORMAPS = { viridis:["#440154","#482878","#3E4A89","#31688E","#26828E","#1F9E89","#35B779","#6DCD59","#B4DE2C","#FDE725"], magma: ["#000004","#180F3E","#451077","#721F81","#9F2F7F","#CD4071","#F1605D","#FD9567","#FEC98D","#FCFDBF"], plasma: ["#0D0887","#47039F","#7301A8","#9C179E","#BD3786","#D8576B","#ED7953","#FA9E3B","#FDC926","#F0F921"], inferno:["#000004","#1B0C42","#4B0C6B","#781C6D","#A52C60","#CF4446","#ED6925","#FB9A06","#F7D03C","#FCFFA4"], cividis:["#00204D","#00336F","#39486B","#575D6D","#707173","#8A8779","#A69D75","#C4B56C","#E4CF5B","#FFEA46"], turbo: ["#30123B","#4145AB","#4675ED","#39A2FC","#1BCFD4","#24ECA6","#61FC6C","#A4FC3B","#D1E834","#F9BD38","#FB7E21","#E4460A","#A92102","#7A0403"] }; var BREWER = { Set1:["#E41A1C","#377EB8","#4DAF4A","#984EA3","#FF7F00","#FFFF33","#A65628","#F781BF","#999999"], Set2:["#66C2A5","#FC8D62","#8DA0CB","#E78AC3","#A6D854","#FFD92F","#E5C494","#B3B3B3"], Dark2:["#1B9E77","#D95F02","#7570B3","#E7298A","#66A61E","#E6AB02","#A6761D","#666666"], Paired:["#A6CEE3","#1F78B4","#B2DF8A","#33A02C","#FB9A99","#E31A1C","#FDBF6F","#FF7F00","#CAB2D6","#6A3D9A","#FFFF99","#B15928"], Spectral:["#9E0142","#D53E4F","#F46D43","#FDAE61","#FEE08B","#FFFFBF","#E6F598","#ABDDA4","#66C2A5","#3288BD","#5E4FA2"] }; /* ---------- state ---------- */ var state = { mode:"discrete", named:true, full:true, dScale:"manual", dXVar:"category", dYVar:"value", dCats:"C1, C2, C3", groups:[{level:"A",label:"",color:"#A0B981"},{level:"B",label:"",color:"#47547C"},{level:"C",label:"",color:"#9F8288"}], dViridis:"viridis", dViridisDir:1, dBrewer:"Set2", dPalette:"viridis", dChart:"bar", cScale:"gradient", cViridis:"viridis", cViridisDir:1, cXVar:"x", cYVar:"y", gradLow:"#132B43", gradHigh:"#56B1F7", gradMid:"#FFFFBF", gradUseMid:false, cChart:"tile", cLimitsOn:false, cMin:"0", cMax:"100", cNaOn:false, cNaColor:"#7F7F7F", legTitleOn:false, legTitle:"", legStyle:"labs", titleOn:false, titleText:"", theme:"gray", dBreaksOn:false, cBreaksOn:false, cBreaks:"0, 25, 50, 75, 100" }; var presets = [ {name:"KARADA",cols:["#A0B981","#47547C","#9F8288","#C2A86B","#6FA39B"]}, {name:"warm",cols:["#F2C14E","#F78154","#B4436C","#5C374C"]}, {name:"cool",cols:["#264653","#2A9D8F","#8AB17D","#E9C46A"]} ]; /* ---------- helpers ---------- */ // DOM要素の取得はShadow DOM内で行う function $(id){ return shadow.getElementById(id); } function el(tag,attrs,kids){ var e=document.createElement(tag); attrs=attrs||{}; for(var k in attrs){ var v=attrs[k]; if(v==null) continue; if(k==="class") e.className=v; else if(k==="style") e.setAttribute("style",v); else if(k==="html") e.innerHTML=v; else if(k.slice(0,2)==="on") e.addEventListener(k.slice(2).toLowerCase(),v); else e.setAttribute(k,v); } (kids||[]).forEach(function(c){ if(c==null) return; e.appendChild(typeof c==="string"?document.createTextNode(c):c); }); return e; } function isHex(v){ return /^#([0-9a-fA-F]{6}|[0-9a-fA-F]{3})$/.test(v); } function norm(v){ v=(v||"").trim(); if(v[0]!=="#") v="#"+v; if(/^#[0-9a-fA-F]{3}$/.test(v)) v="#"+v[1]+v[1]+v[2]+v[2]+v[3]+v[3]; return v.toUpperCase(); } function hex2rgb(h){ h=h.replace("#",""); return [parseInt(h.slice(0,2),16),parseInt(h.slice(2,4),16),parseInt(h.slice(4,6),16)]; } function rgb2hex(a){ return "#"+a.map(function(v){ return ("0"+Math.round(v).toString(16)).slice(-2); }).join("").toUpperCase(); } // ggplot2(scales::colour_ramp)と同じく CIE Lab 空間で色を補間する function srgb2lin(c){ c/=255; return c<=0.04045 ? c/12.92 : Math.pow((c+0.055)/1.055,2.4); } function lin2srgb(c){ c=c<=0.0031308 ? c*12.92 : 1.055*Math.pow(Math.max(0,c),1/2.4)-0.055; return Math.max(0,Math.min(255,c*255)); } function rgb2lab(rgb){ var r=srgb2lin(rgb[0]),g=srgb2lin(rgb[1]),b=srgb2lin(rgb[2]); var X=(r*0.4124+g*0.3576+b*0.1805)/0.95047, Y=r*0.2126+g*0.7152+b*0.0722, Z=(r*0.0193+g*0.1192+b*0.9505)/1.08883; function f(t){ return t>0.008856 ? Math.cbrt(t) : 7.787*t+16/116; } var fx=f(X),fy=f(Y),fz=f(Z); return [116*fy-16,500*(fx-fy),200*(fy-fz)]; } function lab2rgb(lab){ var fy=(lab[0]+16)/116, fx=fy+lab[1]/500, fz=fy-lab[2]/200; function fi(t){ var t3=t*t*t; return t3>0.008856 ? t3 : (t-16/116)/7.787; } var X=fi(fx)*0.95047, Y=fi(fy), Z=fi(fz)*1.08883; return [ lin2srgb(X*3.2406-Y*1.5372-Z*0.4986), lin2srgb(-X*0.9689+Y*1.8758+Z*0.0415), lin2srgb(X*0.0557-Y*0.2040+Z*1.0570) ]; } function sample(stops,t){ t=Math.max(0,Math.min(1,t)); var seg=t*(stops.length-1),i=Math.floor(seg),f=seg-i; if(i>=stops.length-1) return stops[stops.length-1].toUpperCase(); var a=rgb2lab(hex2rgb(stops[i])), b=rgb2lab(hex2rgb(stops[i+1])); return rgb2hex(lab2rgb([a[0]+(b[0]-a[0])*f,a[1]+(b[1]-a[1])*f,a[2]+(b[2]-a[2])*f])); } function rng(a,b){ var x=Math.sin((a+1)*12.9898+(b+1)*78.233)*43758.5453; return x-Math.floor(x); } var BOX_N=9; function boxValues(ci,gi){ var center=20+rng(ci,gi)*60; var spread=6+rng(ci*5+1,gi*3+2)*8; var out=[]; for(var k=0;k=loF && v<=hiF;}); var lwsk=inl.length?inl[0]:q1, uwsk=inl.length?inl[inl.length-1]:q3; var outliers=s.filter(function(v){return vhiF;}); return {q1:q1,med:med,q3:q3,lo:lwsk,hi:uwsk,outliers:outliers}; } function trunc(s,n){ s=String(s); return s.length>n?s.slice(0,n-1)+"…":s; } function hsl2hex(h,s,l){ s/=100;l/=100; var c=(1-Math.abs(2*l-1))*s,x=c*(1-Math.abs((h/60)%2-1)),m=l-c/2,r=0,g=0,b=0; if(h<60){r=c;g=x;}else if(h<120){r=x;g=c;}else if(h<180){g=c;b=x;} else if(h<240){g=x;b=c;}else if(h<300){r=x;b=c;}else{r=c;b=x;} function h2(v){ return ("0"+Math.round((v+m)*255).toString(16)).slice(-2); } return ("#"+h2(r)+h2(g)+h2(b)).toUpperCase(); } function sanitizeName(s){ s=(s||"").trim(); if(!s) return "value"; var clean = s.replace(/`/g,""); var isStandard = /^[a-zA-Z.][a-zA-Z0-9._]*$/.test(clean); return isStandard ? clean : "`" + clean + "`"; } function escStr(s){ return String(s).replace(/\\/g, "\\\\").replace(/"/g, '\\"'); } function isViridisPal(nm){ return COLORMAPS.hasOwnProperty(nm); } function discreteColors(){ var n=state.groups.length; if(state.dScale==="manual") return state.groups.map(function(g){ return isHex(g.color)?g.color:"#CCCCCC"; }); if(isViridisPal(state.dPalette)){ var st=COLORMAPS[state.dPalette]; return state.groups.map(function(_,i){ var t=n===1?0.5:i/(n-1); if(state.dViridisDir===-1)t=1-t; return sample(st,t); }); } var pal=BREWER[state.dPalette]||BREWER.Set2; return state.groups.map(function(_,i){ return pal[i%pal.length]; }); } function contColor(t){ if(state.cScale==="viridis"){ var st=COLORMAPS[state.cViridis]; if(state.cViridisDir===-1)t=1-t; return sample(st,t); } var stops=state.gradUseMid?[state.gradLow,state.gradMid,state.gradHigh]:[state.gradLow,state.gradHigh]; return sample(stops,t); } function cssGrad(fn){ var s=[]; for(var i=0;i<=10;i++) s.push(fn(i/10)+" "+(i*10)+"%"); return "background:linear-gradient(90deg,"+s.join(",")+")"; } function cssDiscrete(pal,n){ var s=[]; for(var i=0;i=MAX_GROUPS; acts.appendChild(el("button",{class:"btn primary",disabled:atMax?"":null,onClick:addGroup}, [atMax?"上限に達しました(10色)":"+ グループを追加("+state.groups.length+"/"+MAX_GROUPS+")"])); if(state.dScale==="manual") acts.appendChild(el("button",{class:"btn",onClick:autoGen},["自動生成"])); if(state.groups.length>1) acts.appendChild(el("button",{class:"btn",onClick:function(){ state.groups.reverse(); rebuild(); }},["逆順"])); root.appendChild(acts); if(state.dScale==="manual") root.appendChild(buildPresets()); } function legendText(g){ return (g.label||"").trim() ? g.label : g.level; } function legendTitleText(def){ return (state.legTitleOn && (state.legTitle||"").trim()) ? state.legTitle : def; } function dxVar(){ return (state.dXVar||"").trim() ? sanitizeName(state.dXVar) : "category"; } function dyVar(){ return (state.dYVar||"").trim() ? sanitizeName(state.dYVar) : "value"; } function cxVar(){ return (state.cXVar||"").trim() ? sanitizeName(state.cXVar) : "x"; } function cyVar(){ return (state.cYVar||"").trim() ? sanitizeName(state.cYVar) : "y"; } function parseList(s){ return (s||"").split(",").map(function(x){return x.trim();}).filter(function(x){return x!=="";}); } function catList(){ var p=parseList(state.dCats); return p.length?p:["C1","C2","C3"]; } function txtField(cap,key,w){ var inp=el("input",{class:"lblinp",type:"text",value:state[key],spellcheck:"false", style:"flex:none;width:"+(w||140)+"px;max-width:100%", onInput:function(e){ state[key]=e.target.value; soft(); }}); return field(cap,inp); } function groupRow(g,i){ var derived=state.dScale!=="manual"; var color=derived?discreteColors()[i]:g.color; var row=el("div",{class:"row2"}); var sw,pick; if(derived){ row.appendChild(el("span",{class:"sw ro",style:"background:"+color})); } else{ sw=el("label",{class:"sw",style:"background:"+(isHex(color)?color:"#fff")}); pick=el("input",{type:"color",value:isHex(color)?color:"#000000","aria-label":"色 "+(i+1), onInput:function(){ state.groups[i].color=pick.value.toUpperCase(); soft(); }}); sw.appendChild(pick); row.appendChild(sw); } var lev=el("input",{class:"lblinp",type:"text",value:g.level,spellcheck:"false",placeholder:"level", "aria-label":"水準(level) "+(i+1), onInput:function(){ state.groups[i].level=lev.value; soft(); }}); row.appendChild(lev); var disp=el("input",{class:"lblinp",type:"text",value:g.label,spellcheck:"false",placeholder:"表示ラベル", "aria-label":"表示ラベル "+(i+1), onInput:function(){ state.groups[i].label=disp.value; soft(); }}); row.appendChild(disp); if(!derived){ var hex=el("input",{class:"hex",type:"text",value:color,spellcheck:"false",style:"flex:0 0 100px", "aria-label":"16進 "+(i+1), onInput:function(){ var v=hex.value; if(isHex(v)||isHex(norm(v))){ hex.classList.remove("bad"); state.groups[i].color=norm(v); sw.style.background=state.groups[i].color; pick.value=state.groups[i].color; soft(); } else hex.classList.add("bad"); }, onBlur:function(){ if(isHex(norm(hex.value))) state.groups[i].color=norm(hex.value); rebuild(); }}); row.appendChild(hex); } var del=el("button",{class:"del","aria-label":"削除 "+(i+1), disabled: state.groups.length<=1?"":null, onClick:function(){ state.groups.splice(i,1); rebuild(); }}); del.innerHTML="×"; row.appendChild(del); return row; } function buildContinuous(root){ root.appendChild(fieldRow("配色", seg([ {v:"gradient",t:"自分で指定"},{v:"viridis",t:"カラーパレット"} ],state.cScale,function(v){ state.cScale=v; rebuild(); }))); if(state.cScale==="viridis") root.appendChild(viridisOptions("c")); else root.appendChild(gradientOptions()); root.appendChild(continuousExtras()); root.appendChild(el("div",{class:"opt-row"},[ plotTitleControls() ])); root.appendChild(el("div",{class:"opt-row"},[ cBreaksControl(), legendTitleControls() ])); root.appendChild(el("div",{class:"opt-row"},[ txtField("x軸ラベル","cXVar",120), txtField("y軸ラベル","cYVar",120) ])); } function swatchCtrl(key){ var box=el("div",{class:"gswatch"}); var sw=el("label",{class:"sw",style:"background:"+state[key]}); var pick=el("input",{type:"color",value:state[key],onInput:function(){ state[key]=pick.value.toUpperCase(); rebuild(); }}); sw.appendChild(pick); var hex=el("input",{class:"hex",type:"text",value:state[key],spellcheck:"false",style:"width:92px", onInput:function(){ if(isHex(norm(hex.value))){ state[key]=norm(hex.value); sw.style.background=state[key]; soft(); } }, onBlur:function(){ rebuild(); }}); box.appendChild(sw); box.appendChild(hex); return box; } function gradientOptions(){ var wrap=el("div",{class:"opt-row"}); wrap.appendChild(field("low",swatchCtrl("gradLow"))); if(state.gradUseMid) wrap.appendChild(field("mid",swatchCtrl("gradMid"))); wrap.appendChild(field("high",swatchCtrl("gradHigh"))); wrap.appendChild(field("中間色", el("button",{class:"btn",onClick:function(){ state.gradUseMid=!state.gradUseMid; rebuild(); }}, [ state.gradUseMid?"削除":"追加" ]))); wrap.appendChild(field("preview", el("div",{class:"gradbar",style:"width:180px;height:16px;"+cssGrad(function(t){ return contColor(t); })}))); return wrap; } function continuousExtras(){ var wrap=el("div",{class:"opt-row"}); var lim=el("div",{class:"gswatch"}); lim.appendChild(toggle("指定",state.cLimitsOn,function(c){ state.cLimitsOn=c; rebuild(); })); if(state.cLimitsOn){ var mn=el("input",{class:"hex",type:"text",value:state.cMin,style:"width:62px;text-transform:none",placeholder:"min", onInput:function(){ state.cMin=mn.value; soft(); }}); var mx=el("input",{class:"hex",type:"text",value:state.cMax,style:"width:62px;text-transform:none",placeholder:"max", onInput:function(){ state.cMax=mx.value; soft(); }}); lim.appendChild(mn); lim.appendChild(mx); } wrap.appendChild(field("limits = c(min, max)",lim)); var na=el("div",{class:"gswatch"}); na.appendChild(toggle("指定",state.cNaOn,function(c){ state.cNaOn=c; rebuild(); })); if(state.cNaOn) na.appendChild(swatchCtrl("cNaColor")); wrap.appendChild(field("na.value",na)); return wrap; } function legendTitleControls(){ var box=el("div",{class:"gswatch"}); box.appendChild(toggle("指定",state.legTitleOn,function(c){ state.legTitleOn=c; rebuild(); })); if(state.legTitleOn){ box.appendChild(el("input",{class:"lblinp",type:"text",value:state.legTitle,placeholder:"凡例タイトル",style:"flex:0 1 150px", onInput:function(e){ state.legTitle=e.target.value; soft(); }})); } return field("凡例タイトル",box); } function plotTitleControls(){ var box=el("div",{class:"gswatch"}); box.appendChild(toggle("指定",state.titleOn,function(c){ state.titleOn=c; rebuild(); })); if(state.titleOn){ box.appendChild(el("input",{class:"lblinp",type:"text",value:state.titleText,placeholder:"プロットタイトル",style:"flex:0 1 200px", onInput:function(e){ state.titleText=e.target.value; soft(); }})); } return field("プロットタイトル",box); } function cBreaksControl(){ var box=el("div",{class:"gswatch"}); box.appendChild(toggle("指定",state.cBreaksOn,function(c){ state.cBreaksOn=c; rebuild(); })); if(state.cBreaksOn) box.appendChild(el("input",{class:"hex",type:"text",value:state.cBreaks,style:"width:150px;text-transform:none",placeholder:"0, 25, 50", onInput:function(e){ state.cBreaks=e.target.value; soft(); }})); return field("breaks=",box); } function buildPresets(){ var box=el("div",{class:"presets"}); box.appendChild(el("div",{class:"lbl"},["プリセット"])); var chips=el("div",{class:"chips"}); presets.forEach(function(p){ var dots=''+p.cols.slice(0,5).map(function(c){ return ''; }).join("")+''; var chip=el("button",{class:"chip",type:"button",html:dots+''+p.name+''}); chip.addEventListener("click",function(){ state.groups=p.cols.map(function(c,i){ var g=state.groups[i]; return {level:(g&&g.level)||String.fromCharCode(65+i),label:(g&&g.label)||"",color:c}; }); state.dScale="manual"; rebuild(); }); chips.appendChild(chip); }); box.appendChild(chips); return box; } var MAX_GROUPS=10; function addGroup(){ if(state.groups.length>=MAX_GROUPS) return; var i=state.groups.length, pal=["#5B8FF9","#61DDAA","#F6BD16","#7262FD","#78D3F8","#F08BB4","#9270CA","#FF9D4D","#269A99","#D44A4A"]; state.groups.push({level:String.fromCharCode(65+i),label:"",color:pal[i%pal.length]}); rebuild(); } function autoGen(){ var n=Math.max(3,state.groups.length), base=Math.random()*360; for(var i=0;i'); s.push(''); if(withGrid && th.grid){ for(var k=0;k'); } ticks.forEach(function(tk){ var y=m.t+ph-tk*ph; s.push(''); }); } if(showNums){ ticks.forEach(function(tk){ var y=m.t+ph-tk*ph; s.push(''+Math.round(tk*100)+''); }); } if(th.border) s.push(''); if(th.axis){ s.push(''); s.push(''); } } function axisTitles(s,W,H,m,pw,ph,xt,yt,ttl){ s.push(''+xt+''); s.push(''+yt+''); var col=ttl.real?"#18212E":"#9AA3B0", wt=ttl.real?"600":"500", fs=ttl.real?13:12; s.push(''+ttl.t+''); } function escXml(s){ return String(s).replace(/&/g,"&").replace(//g,">"); } function plotTitleText(def){ if(state.titleOn && (state.titleText||"").trim()) return {t:escXml(trunc(state.titleText.trim(),44)), real:true}; return {t:def, real:false}; } function paintDiscrete(){ var cols=discreteColors(), labels=state.groups.map(legendText), n=cols.length; var W=520,H=360,m={t:34,r:124,b:46,l:46},pw=W-m.l-m.r,ph=H-m.t-m.b,s=[]; s.push(''); axisFrame(s,W,H,m,pw,ph,true); if(state.dChart==="bar"){ var cats=catList(),bandW=pw/cats.length,inset=bandW*0.14,innerW=bandW-inset*2; var gap=Math.min(4,innerW/n*0.18),bw=(innerW-gap*(n-1))/n; cats.forEach(function(cat,ci){ var bx=m.l+ci*bandW+inset; for(var gi=0;gi'); } s.push(''+trunc(cat,7)+''); }); } else if(state.dChart==="boxplot"){ var bcats=catList(); var bbandW=pw/n, boxw=Math.min(bbandW*0.5,58); var Yv=function(v){ return m.t+ph-(v/100)*ph; }; for(var gi=0;gi'); s.push(''); s.push(''); s.push(''); st.outliers.forEach(function(ov){ s.push(''); }); var glv=(state.groups[gi].level||"").trim()||String.fromCharCode(65+gi); s.push(''+trunc(glv,7)+''); } } else if(state.dChart==="line"){ var lcats=catList(), lbandW=pw/lcats.length; var cxl=function(ci){ return m.l + ci*lbandW + lbandW/2; }; var Yl=function(val){ return m.t+ph - val*ph; }; for(var gi=0;gi'); for(var cj=0;cj'); } } lcats.forEach(function(cat,ci){ s.push(''+trunc(cat,7)+''); }); } else { var scats=catList(), sbandW=pw/scats.length; var sx=function(ci){ return m.l + ci*sbandW + sbandW/2; }; var Ys=function(val){ return m.t+ph - val*ph; }; scats.forEach(function(cat,ci){ for(var gi=0;gi'); } s.push(''+trunc(cat,7)+''); }); } axisTitles(s,W,H,m,pw,ph,trunc(dxVar(),16),trunc(dyVar(),16),plotTitleText("")); var lx=m.l+pw+16,ly=m.t+4; s.push(''+trunc(legendTitleText("group"),12)+''); for(var gi2=0;gi2'); s.push(''+trunc(labels[gi2]||"",11)+''); } s.push(''); $("gpsapp-chart").innerHTML=s.join(""); } function paintContinuous(){ var W=520,H=360,m={t:34,r:104,b:46,l:46},pw=W-m.l-m.r,ph=H-m.t-m.b,s=[]; var vc=function(t){ return contColor(t); }; s.push(''); var stops=""; for(var i=0;i<=10;i++) stops+=''; s.push(''+stops+''); axisFrame(s,W,H,m,pw,ph, true); if(state.cChart==="tile"){ var cc=9,rr=6; var padX = pw * 0.05, padY = ph * 0.05; var innerW = pw - padX * 2, innerH = ph - padY * 2; var tw = innerW / cc, th = innerH / rr; var R_VALS = [ 0.266,0.372,0.573,0.908,0.202,0.898,0.945,0.661,0.629, 0.062,0.206,0.177,0.687,0.384,0.770,0.498,0.718,0.992, 0.380,0.777,0.935,0.212,0.652,0.126,0.267,0.386,0.013, 0.382,0.870,0.340,0.482,0.600,0.494,0.186,0.827,0.668, 0.794,0.108,0.724,0.411,0.821,0.647,0.783,0.553,0.530, 0.789,0.023,0.477,0.732,0.693,0.478,0.861,0.438,0.245 ]; for(var r=0;r'); } } axisTitles(s,W,H,m,pw,ph,trunc(cxVar(),16),trunc(cyVar(),16),plotTitleText("連続スケール")); } else { for(var p=0;p<40;p++){ var v=rng(p,p*2),px=m.l+rng(p*3,7)*pw,py=m.t+ph-rng(p,11)*ph; s.push(''); } axisTitles(s,W,H,m,pw,ph,trunc(cxVar(),16),trunc(cyVar(),16),plotTitleText("連続スケール")); } var lx=m.l+pw+16,lw=15,lh=ph*0.78,ly=m.t+(ph-lh)/2; s.push(''+trunc(legendTitleText("value"),10)+''); s.push(''); [0,.25,.5,.75,1].forEach(function(tk){ var yy=ly+lh-tk*lh; var lo=state.cLimitsOn?parseFloat(state.cMin):0, hi=state.cLimitsOn?parseFloat(state.cMax):100; if(isNaN(lo))lo=0; if(isNaN(hi))hi=100; var val=lo+(hi-lo)*tk, lbl=Math.abs(hi-lo)<=5?val.toFixed(1):String(Math.round(val)); s.push(''); s.push(''+lbl+''); }); if(state.cNaOn){ var ny=ly+lh+16; s.push(''); s.push('NA'); } s.push(''); $("gpsapp-chart").innerHTML=s.join(""); } /* ---------- code ---------- */ function palVector(){ if(state.named) return "pal <- c(\n"+state.groups.map(function(g){ return ' "'+escStr(g.level)+'" = "'+g.color+'"'; }).join(",\n")+"\n)"; return "pal <- c("+state.groups.map(function(g){ return '"'+g.color+'"'; }).join(", ")+")"; } function parseBreaks(s){ var p=(s||"").split(",").map(function(x){return x.trim();}).filter(function(x){return x!=="";}); return p.length?p.join(", "):""; } function dExtraArgs(){ var a=[]; if(state.dBreaksOn) a.push("breaks = c("+state.groups.map(function(g){ return '"'+escStr(g.level)+'"'; }).join(", ")+")"); var hasLabel = state.groups.some(function(g){ return (g.label||"").trim()!==""; }); if(hasLabel) { a.push("labels = c("+state.groups.map(function(g){ return '"'+escStr(g.level)+'" = "'+escStr((g.label||"").trim()||g.level)+'"'; }).join(", ")+")"); } return a; } function cExtraArgs(){ var a=[]; if(state.cLimitsOn){ var mn=(state.cMin+"").trim()||"NA", mx=(state.cMax+"").trim()||"NA"; a.push("limits = c("+mn+", "+mx+")"); } if(state.cBreaksOn){ var bk=parseBreaks(state.cBreaks); if(bk) a.push("breaks = c("+bk+")"); } if(state.cNaOn) a.push('na.value = "'+state.cNaColor+'"'); return a; } function titleLayer(aes){ var parts=[]; if(state.titleOn && (state.titleText||"").trim()) parts.push('title = "'+escStr(state.titleText.trim())+'"'); if(state.legTitleOn && (state.legTitle||"").trim()) parts.push(aes+' = "'+escStr(state.legTitle.trim())+'"'); if(!parts.length) return null; return "labs("+parts.join(", ")+")"; } function callFmt(fn,args){ var one=fn+"("+args.join(", ")+")"; if(args.length<=2 && one.length<=58) return one; return fn+"(\n "+args.join(",\n ")+"\n)"; } function indent(block){ return block.split("\n").map(function(ln,k){ return k===0?ln:" "+ln; }).join("\n"); } function currentAes(){ if(state.mode==="discrete") return (state.dChart==="point"||state.dChart==="line") ? "colour" : "fill"; return state.cChart==="scatter" ? "colour" : "fill"; } function dataBlock(){ if(state.mode==="discrete"){ if(state.dChart==="boxplot"){ var lvB=state.groups.map(function(g,i){ return (g.level||"").trim()||String.fromCharCode(65+i); }); var lvqB=lvB.map(function(s){ return '"'+escStr(s)+'"'; }).join(", "); var catsB=catList(), ncB=catsB.length, catqB=catsB.map(function(s){ return '"'+escStr(s)+'"'; }).join(", "); var nB=lvB.length, valsB=[], xvB=dxVar(), yvB=dyVar(); for(var ciB=0;ciB/g,">"); s=s.replace(/"([^"]*)"/g,'"$1"'); s=s.replace(/(^|\n)(#[^\n]*)/g,'$1$2'); s=s.replace(/\blibrary\b/g,'library'); s=s.replace(/\b(scale_[a-z0-9_]+|ggplot|aes|geom_[a-z0-9_]+|theme_[a-z0-9_]+|c|data\.frame|expand\.grid|set\.seed|runif|rep|factor|nrow|labs)\b(?=\()/g,'$1'); return s; } function code(){ $("gpsapp-code").innerHTML=highlight(codePlain()); } function buildCodeOpts(){ var box=$("gpsapp-codeopts"); box.innerHTML=""; if(state.mode==="discrete"&&state.dScale==="manual") box.appendChild(toggle("名前付き",state.named,function(c){ state.named=c; code(); })); box.appendChild(toggle("完全な例",state.full,function(c){ state.full=c; code(); })); box.appendChild(el("button",{class:"copy",id:"gpsapp-save",onClick:doSave},["保存(.R)"])); box.appendChild(el("button",{class:"copy",id:"gpsapp-copy",onClick:doCopy},["コピー"])); } function doSave(){ var txt=codePlain(); try{ var blob=new Blob([txt],{type:"text/plain;charset=utf-8"}); var url=URL.createObjectURL(blob); var a=document.createElement("a"); a.href=url; a.download="ggplot_palette.R"; document.body.appendChild(a); a.click(); document.body.removeChild(a); setTimeout(function(){ URL.revokeObjectURL(url); },1000); var b=$("gpsapp-save"); b.textContent="保存しました"; b.classList.add("done"); setTimeout(function(){ b.textContent="保存(.R)"; b.classList.remove("done"); },1400); }catch(e){ doCopy(); } } function doCopy(){ var btn=$("gpsapp-copy"),txt=codePlain(); function done(){ btn.textContent="コピーしました"; btn.classList.add("done"); setTimeout(function(){ btn.textContent="コピー"; btn.classList.remove("done"); },1400); } function fb(){ var ta=document.createElement("textarea"); ta.value=txt; document.body.appendChild(ta); ta.select(); try{ document.execCommand("copy"); done(); }catch(e){} document.body.removeChild(ta); } if(navigator.clipboard&&navigator.clipboard.writeText) navigator.clipboard.writeText(txt).then(done,fb); else fb(); } function soft(){ paint(); code(); } function rebuild(){ buildEditor(); buildToggle(); buildCodeOpts(); paint(); code(); } rebuild(); })(); });


少しでも、だれかの解析が楽になりますように!!

スポンサーリンク
価格および配送状況は変更される場合があります。購入時は商品ページをご確認ください。
当サイトに表示されている商品情報はAmazonから提供されたものであり、更新または削除される場合があります。
karada-goodはAmazonアソシエイトとして、適格販売により収入を得ています。