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

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(); })(); });

<おすすめのスピーカー>

作業中に音楽を流すと癒されます。値段が約5万円としますが、かなりおすすめです。

Amazon「VGP2026SUMMER金賞&デスクトップオーディオ大賞」EDIFIER M90 デスクトップスピーカー Bluet¥35,235www.amazon.co.jpAmazonで見る

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

スポンサーリンク
Prices and shipping availability may change. Please refer to the product page at time of purchase.
Content displayed on this site is provided by Amazon and may be updated or removed.
Amazon Associate, karada-good earns income through qualifying sales.