Modul:Befolkningsutveckling WD

Från Wikipedia

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