모듈:국세조사/도도부현내 자치단체

local function createGraph(code)
	local width=768
	local height=512
	local max=0
	local first=8
	if code=="00000" then
		first=0
	elseif code=="19000" then
		first=18
	end
	local ptable={}
	for _,v in pairs(mw.loadData("Module:国勢調査/"..string.sub(code,1,2))) do
		if v.code~="00000" and string.sub(v.name,-3)~="局" then
			for y=1,20 do
				local p=v.valuey
				if p>max then
					max=p
				end
			end
			local hue=0
			local tail=string.sub(v.name,-3)
			if string.sub(v.code,3,3)=="1" then
				hue=270
			elseif tail=="町" then
				hue=90
			elseif tail=="村" then
				hue=180
			end
			ptable#ptable+1={
				code=v.code,
				name=v.name,
				value=v.value,
				hue=hue
			}
		end
	end
	local marks={}
	return {
		width=width,
		height=height,
		padding=16,
		signals={
			{
				name="yr",
				init=19,
				streams={
					{
						type="mousemove",
						expr="min(max(floor(eventY()/"..(height/(20-first)).."+"..first.."),"..first.."),19)"
					}
				}
			},
			{
				name="yrtext",
				init={
					"2015年",
					"(平成27年)"
				},
				streams={
					{
						type="mousemove",
						expr="(1920+yr*5)+'年','('+(1920+yr*5<1926?'大正'+(1920+yr*5-1911):1920+yr*5<1989?'昭和'+(1920+yr*5-1925):'平成'+(1920+yr*5-1988))+'年)'"
					}
				}
			},
			{
				name="count",
				init=#ptable
			},
			{
				name="rankrange",
				init=1,
				streams={
					{
						type="click",
						expr="count<=50?1:rankrange==1?count-49:1"
					}
				}
			}
		},
		data={
			{
				name="table",
				values=ptable,
				transform={
					{
						type="formula",
						field="last",
						expr="datum.value19"
					},
					{
						type="sort",
						by={
							"-last",
							"code"
						}
					},
					{
						type="rank"
					},
					{
						type="filter",
						test="rankrange<=datum.rank && datum.rank<=49+rankrange"
					},
					{
						type="formula",
						field="active",
						expr="datum.valueyr"
					}
				}
			}
		},
		scales={
			{
				name="xscale",
				type="ordinal",
				points=true,
				padding=0.75,
				domain={
					data="table",
					field="rank"
				},
				range={
					48,
					width
				}
			},
			{
				name="yscale",
				domain={
					0,
					max
				},
				nice=true,
				range={
					height-72,
					0
				}
			}
		},
		axes={
			{
				type="y",
				scale="yscale",
				offset=-48,
				grid=true
			}
		},
		marks={
			{
				type="rect",
				from={
					data="table"
				},
				properties={
					update={
						xc={
							scale="xscale",
							field="rank"
						},
						width={
							value=12
						},
						y={
							scale="yscale",
							field="active"
						},
						y2={
							scale="yscale",
							value=0
						},
						fill={
							h={
								field="hue"
							},
							s={
								value=0.5
							},
							l={
								value=0.5
							}						
						}
					}
				}
			},
			{
				type="group",
				from={
					data="table",
					transform={
						{
							type="facet",
							groupby={
								"rank"
							}
						}
					}
				},
				marks={
					{
						type="text",
						from={
							transform={
								{
									type="countpattern",
									field="name",
									pattern="."
								},
								{
									type="rank"
								}
							}
						},
						properties={
							update={
								align={
									value="center"
								},
								baseline={
									value="top"
								},
								fill={
									value="black"
								},
								x={
									scale="xscale",
									field={
										parent="rank"
									}
								},
								y={
									field="rank",
									offset=height-72-8,
									mult=12
								},
								text={
									field="text"
								},
								font={
									value="TakaoGothic"
								}
							}
						}					
					}
				}
			},
			{
				type="text",
				properties={
					update={
						align={
							value="center"
						},
						baseline={
							value="top"
						},
						fill={
							value="black"
						},
						fontSize={
							value=32
						},
						x={
							value=width-80
						},
						y={
							value=4
						},
						text={
							signal="yrtext0"
						},
						font={
							value="TakaoGothic"
						}
					}
				}
			},
			{
				type="text",
				properties={
					update={
						align={
							value="center"
						},
						baseline={
							value="top"
						},
						fill={
							value="black"
						},
						fontSize={
							value=18
						},
						x={
							value=width-80
						},
						y={
							value=40
						},
						text={
							signal="yrtext1"
						},
						font={
							value="TakaoGothic"
						}
					}
				}
			}
		}
	}
end
return {
	main=function(frame)
		local result=createGraph(frame:getParent().args.code)
		if result~=nil then
			return frame:extensionTag('graph',mw.text.jsonEncode(result),{mode='interactive'})
		else
			return ""
		end
	end
}