Hoppa till innehållet

Modul:Heatmap

Från Wikipedia

Dokumentationen för denna modul kan skapas på Modul:Heatmap/dok

local p = {}

require "mw.ustring"

function tablesize(T)
   local n = 0
   for _ in pairs(T) do n = n + 1 end
   return n
end

-- heatmap, skapar en tabell med bakgrundsfärg per cell styrd av cellens värde. 
---         Bakgrundsfärgens tre komponenter (rgb) är en interpolation av valbara värden för max- och minvärde i datamängden 
--
-- parametrar 
-- ==========
-- values (obligatorisk): tabellens värden separerade av kommatecken, rader separarerade med semikolon. Alla celler måste tilldelas ett värde
-- log (frivillig): om parametern ges ett värde är det logaritmen av data snarare än data som styr färgen, används lämpligen för datamängder med stor "dynamik"
-- style (frivillig): stil för tabellen
-- hidedata (frivillig): om parametern ges värdet 'yes' visas inga värden i datacellerna, i annat fall visas värdena
-- mincolor (frivillig): hexadecimal kod för färgen som motsvarar det minsta datavärdet i tabellen, 60ff40 om inget annat anges
-- maxcolor (frivillig): hexadecimal kod för färgen som motsvarar det största datavärdet i tabellen, ff6040 om inget annat anges
-- headers (frivillig): en kommaseparerad lista med värden för tabellens kolumnrubriker
-- footers (frivillig): en kommaseparerad lista med värden för tabellens kolumnfötter
-- datacolumns (frivillig): en kommaseparerad lista med ettor för de kolumner som ska färgläggas, om parametern utelämnas färgläggs alla kolumner

p.heatmap = function(frame)
   local style = frame.args['style'] or 'text-align:center;'
   local hidedata = frame.args['hidedata'] or ''
   local log = frame.args['log']
   local mincolor = frame.args['mincolor'] or '60ff40'
   local minred = tonumber(mw.ustring.sub(mincolor,1,2),16)
   local mingreen = tonumber(mw.ustring.sub(mincolor,3,4),16)
   local minblue = tonumber(mw.ustring.sub(mincolor,5,6),16)
   local maxcolor = frame.args['maxcolor'] or 'ff6040'
   local maxred = tonumber(mw.ustring.sub(maxcolor,1,2),16)
   local maxgreen = tonumber(mw.ustring.sub(maxcolor,3,4),16)
   local maxblue = tonumber(mw.ustring.sub(maxcolor,5,6),16)
   local headers = frame.args['headers']
   local theheaders = {}
   if (headers) then theheaders = mw.text.split(headers,',',true) end
   local ncolumns = 0
   local datacolumns = frame.args['datacolumns'] or ''
   local thedatacolumns = mw.text.split(datacolumns,',',true)
   local values = frame.args['values'] or '0' 
   local therows = mw.text.split(values,';',true)
   local nrows = tablesize(therows)
   local footers = frame.args['footers'] 
   local thefooters = {} 
   if (footers) then thefooters = mw.text.split(footers,',',true) end
   local res = '{| class="wikitable" style="' .. style .. '"\n|-\n'
   local minvalue = 1e99
   local maxvalue = -1e99
   for r=1,nrows do
   	local onerow = mw.text.split(therows[r],',',true)
    ncolumns = tablesize(onerow)
   	for c=1,ncolumns do
   		if (datacolumns == '' or thedatacolumns[c]=='1') then
   	   		if (tonumber(onerow[c]) > maxvalue) then maxvalue = tonumber(onerow[c]) end
   	   		if (tonumber(onerow[c]) < minvalue) then minvalue = tonumber(onerow[c]) end
   		end
   	end
   end
   if (headers) then 
	 for c=1,ncolumns do res = res .. '! ' .. theheaders[c] .. '\n' end
   end 
   for r=1,nrows do
   	 local onerow = mw.text.split(therows[r],',',true)
   	 res = res .. '|-\n'
   	 for c=1,ncolumns do
   	 	res = res .. '| '
   	 	local displaydata = onerow[c]
   	 	if (datacolumns == '' or thedatacolumns[c]=='1') then
   	 		local heat = 0.5 
   	 		if (maxvalue>minvalue) then 
   	 			heat = (onerow[c]-minvalue)/(maxvalue-minvalue)
   	 		    if (log) then heat = (math.log(onerow[c]-minvalue+1))/(math.log(maxvalue-minvalue+1)) end
   	 		end
   	 		res = res .. 'style="background-color:rgb(' .. math.floor(minred+(maxred-minred)*heat+0.5) .. ',' .. math.floor(mingreen+(maxgreen-mingreen)*heat+0.5) .. ',' .. math.floor(minblue+(maxblue-minblue)*heat+0.5) .. ');" |'
   	 	    if (hidedata == 'yes') then displaydata = '&nbsp;' end
   	 	end
		res =res .. displaydata .. '\n'
   	 end
   end
   res = res .. '|-\n'
   if (footers) then 
   	for c=1,ncolumns do res = res .. '! ' .. thefooters[c] .. '\n' end
   end
   res = res .. '\n|}'
   return res
end

return p