Modul:Befolkningsutveckling WD

Från Järnvägsdata
 -- 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) 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 .. 'Folkmängd saknas för år ' .. year .. '!
' 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 = '

' res = res .. '
' .. diagramrubrik .. '
'
       steg = skalsteg(maxpop)
       if steg == maxy then steg = steg/10 end
       for s = 0, maxy/steg do
res = res .. '
' res = res .. '
' .. s .. '
'
       end
res = res .. '
×' .. frame:preprocess( .. steg .. ) .. '
' res = res .. '
'
       for i = 1,n do
res = res .. '
' res = res .. '
'..years[i]..'
'
       end 
res = res .. '

'

return res .. err

   end
   return p