Modul:Befolkningsutveckling WD
Utseende
Dokumentation [visa] [redigera] [historik] [rensa sidcachen]
-- Skapar ett histogram över folkmängden för ett antal år genom att hämta property P1082 från Wikidata
-- Parametrar:
-- y (obligatorisk): En uppräkning av årtal. Exempel: 2015,2016,2017
-- barcolor (frivillig): färgen på staplarna angivet som #nnnnnn eller standardfärg, lightblue om parametern utelämnas
-- barwidth (frivillig): bredden på en stapel i förhållande till en n:tedel av diagrammet där n är antal år, 0.5 om parametern utelämnas
-- id (frivillig): Q-numret för Wikidataobjektet. Exempel:Q21595741
-- boxheight (frivillig): höjden på rutan i px, 200 om parametern utelämnas
-- boxwidth (frivillig): bredden på rutan i px, 250 om parametern utelämnas
-- border (frivillig): ramstil, 1px solid #ccc om parametern utelämnas
-- diagramrubrik (frivillig): rubrik för diagrammet, "Befolkningsutveckling y1–yN" där y1 och yN är första respektive sista år (y) om parametern utelämnas
-- diagrambottommargin (frivillig): marginal under diagrammet i px, 20 om parametern utelämnas
-- diagramtopmargin (frivillig): marginal ovanför diagrammet i px, 40 om parametern utelämnas
-- diagramleftmargin (frivillig): marginal till vänster om diagrammet i px, 20 om parametern utelämnas
-- diagramrightmargin (frivillig): marginal till häger om diagrammet i px, 10 om parametern utelämnas
local p = {}
function skalmax(maxy)
return math.ceil(maxy/10^(math.ceil(math.log10(maxy))-1))*10^(math.ceil(math.log10(maxy))-1)
end
function skalsteg(maxy)
return 10^(math.ceil(math.log10(maxy))-1)
end
function p.Histogram1(frame)
local res = ''
local err = ''
local entity = nil
local args = nil
if (frame.args['y']) then
args = frame.args
else
args = frame:getParent().args
end
if args['id'] then
entity = mw.wikibase.getEntityObject(args['id'])
else
entity = mw.wikibase.getEntityObject()
end
if (entity==nil) then
return nil
end
local years = {}
local pops = {}
local n = 0
local maxpop = 0
local y = args['y']
for year in string.gmatch(y, "%d+") do
i = 1
while (entity.claims['P1082'][i]) do
y=string.sub(entity.claims['P1082'][i].qualifiers['P585'][1].datavalue.value['time'],2,5)
if (y == year) and not entity.claims['P1082'][i].qualifiers['P518'] then
n = n + 1
years[n] = year
pops[n] = entity.claims['P1082'][i].mainsnak.datavalue.value.amount+0
if pops[n] > maxpop then maxpop = pops[n] end
break
end
i = i + 1
end
if (not entity.claims['P1082'][i]) then
err = err .. '<span style="color:red;font-weight:bold;">Folkmängd saknas för år ' .. year .. '!<br /></span>'
end
end
local boxheight = args['boxheight'] or 200
local boxwidth = args['boxwidth'] or 250
local border = args['border'] or '1px solid #aaa'
local diagrambottommargin = args['diagrambottommargin'] or 20
local diagramtopmargin = args['diagramtopmargin'] or 40
local diagramleftmargin = args['diagramleftmargin'] or 20
local diagramrightmargin = args['diagramrightmargin'] or 10
local diagramheight = boxheight - diagrambottommargin - diagramtopmargin
local diagramwidth = boxwidth - diagramleftmargin - diagramrightmargin
local yearwidth = diagramwidth/n
local barwidth = yearwidth*(args['barwidth'] or 0.5)
local barcolor = args['barcolor'] or 'lightblue'
local diagramrubrik = args['diagramrubrik'] or 'Befolkningsutveckling ' .. years[1] .. '–' .. years[n]
local maxy = skalmax(maxpop)
res = '<div style="position:relative;width:' .. boxwidth ..'px; height:' .. boxheight .. 'px; border:' .. border .. ';">'
res = res .. '<div style="position:absolute;top:5px;width:'..boxwidth..'px;text-align:center;">' .. diagramrubrik .. '</div>'
steg = skalsteg(maxpop)
if steg == maxy then steg = steg/10 end
for s = 0, maxy/steg do
res = res .. '<div style="position:absolute;top:' .. diagramtopmargin+diagramheight*(maxy-s*steg)/maxy .. 'px;left:15px;height:10px;width:' .. diagramwidth+diagramleftmargin-15 .. 'px;border-top:1px solid #ccc;"></div>'
res = res .. '<div style="position:absolute;top:' .. diagramtopmargin+diagramheight*(maxy-s*steg)/maxy-8 .. 'px;left:5px;height:20px;width:' .. diagramwidth+diagramleftmargin-15 .. 'px;font-size:x-small;">' .. s .. '</div>'
end
res = res .. '<div style="position:absolute;top:' .. diagramtopmargin-12 .. 'px;left:' .. diagramleftmargin .. 'px;height:20px;font-size:x-small;">×' .. frame:preprocess('{{formatnum:' .. steg .. '}}') .. '</div>'
res = res .. '<div style="position:absolute;top:' .. diagramtopmargin .. 'px;left:15px;width:' .. diagramwidth+diagramleftmargin-15 .. 'px; height:' .. diagramheight .. 'px; border-left:1px solid black;border-bottom:1px solid black;"></div>'
for i = 1,n do
res = res .. '<div style="position:absolute; top:' .. diagramtopmargin+diagramheight*(maxy-pops[i])/maxy .. 'px;left:' .. diagramleftmargin + yearwidth*(i-1)+(yearwidth-barwidth)/2 ..'px;width:' .. barwidth ..'px;height:' .. diagramheight*pops[i]/maxy ..'px;background-color:' .. barcolor .. ';"></div>'
res = res .. '<div style="position:absolute; top:' .. boxheight-diagrambottommargin .. 'px;left:' .. diagramleftmargin + yearwidth*(i-1) ..'px;width:' .. yearwidth ..'px;text-align:center;font-size:x-small;">'..years[i]..'</div>'
end
res = res .. '</div>'
return res .. err
end
return p