Modul:Heatmap
Utseende
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 = ' ' 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