Modul:Graph
Erscheinungsbild
Vorlagenprogrammierung | Diskussionen | Lua | Unterseiten | |||
Modul | Deutsch | English
|
Modul: | Dokumentation |
Diese Seite enthält Code in der Programmiersprache Lua. Einbindungszahl Cirrus
Dies ist die (produktive) Mutterversion eines global benutzten Lua-Moduls.
Wenn die serial-Information nicht übereinstimmt, müsste eine Kopie hiervon in das lokale Wiki geschrieben werden.
Wenn die serial-Information nicht übereinstimmt, müsste eine Kopie hiervon in das lokale Wiki geschrieben werden.
Versionsbezeichnung auf WikiData:
2020-09-01
local p = {}
function p.map(frame)
-- Kartendaten
local map = mw.title.new(frame.args.map or "Wikipedia:Graph/WorldMap-iso2.json")
-- Kartenskalierung (hängt von den Kartendaten ab)
local scale = tonumber(frame.args.scale) or 80
-- Kartenprojektion: siehe https://github.com/mbostock/d3/wiki/Geo-Projections
local projection = frame.args.projection or "equirectangular"
-- Standardfarbe für Staaten ohne Daten
local defaultColor = frame.args.defaultColor or "#C0C0C0"
local scaleType = frame.args.scaleType or "linear"
-- minimaler Wertebereich (nur für numerische Daten)
local domainMin = tonumber(frame.args.domainMin)
-- maximaler Wertebereich (nur für numerische Daten)
local domainMax = tonumber(frame.args.domainMax)
-- Farbwerte der Farbskala (nur für numerische Daten)
local colorScale = frame.args.colorScale or "category10"
-- Kartenmarkierungen als Schlüssel-Wert-Paare: Schlüssel müssen Großbuchstaben, Ziffern oder "-" sein (idealerweise ISO-Codes) und den "id"-Werten der Kartendaten entsprechen
local values = {}
local isNumbers = nil
for name, value in pairs(frame.args) do
local startPos, endPos = string.find(name, "[A-Z0-9\-]+")
if startPos == 1 and endPos == string.len(name) then
if isNumbers == nil then isNumbers = tonumber(value) end
local data = { id = name, v = value }
if isNumbers then data.v = tonumber(data.v) end
table.insert(values, data)
end
end
-- Skalen
local scales
if isNumbers then
if colorScale == "category10" or colorScale == "category20" then else colorScale = mw.text.split(colorScale, ",") end
scales =
{
{
name = "color",
type = scaleType,
domain = { data = "highlights", field = "data.v" },
range = colorScale,
nice = true
}
}
if domainMin then scales[1].domainMin = domainMin end
if domainMax then scales[1].domainMax = domainMax end
local exponent = string.match(scaleType, "pow%s+(%d+%.%d+)") -- auf Exponenten für exponentielle Darstellung prüfen
if exponent then
scales[1].type = "pow"
scales[1].exponent = exponent
end
end
local mapNamespace = map.nsText
if string.len(mapNamespace) > 0 then mapNamespace = mapNamespace .. ":" end
local output =
{
width = 1, -- Dummywert, da Ausgabegröße von den Kartendaten und der Skalierung abhängt
height = 1, -- dito
data =
{
{
-- Datenquelle der Kartenmarkierungen
name = "highlights",
values = values
},
{
-- Datenquelle der Kartendaten
name = "countries",
url = "/w/index.php?title=" .. mapNamespace .. map:partialUrl() .. "&action=raw",
format = { type = "topojson", feature = "countries" },
transform =
{
{
-- geografische Transformation ("geopath") der Kartendaten
type = "geopath",
value = "data", -- Datenquelle
scale = scale, -- Skalierungsfaktor
translate = { 0, 0 }, -- Translation
projection = projection -- Projektionsmethode
},
{
-- Zusammenführung ("zip") mehrerer Datenquellen: hier Kartendaten mit Kartenmarkierungen ("highlights")
type = "zip",
key = "data.id", -- Schlüssel der Kartendaten
with = "highlights", -- Name der Datenquelle der Kartenmarkierungen
withKey = "data.id", -- Schlüssel der Kartenmarkierungen
as = "zipped", -- Ergebnistabellenname
default = { data = { v = defaultColor } } -- Standardaktion für geografische Objekte ohne Entsprechung in unserem Datensatz
}
}
}
},
marks =
{
-- Markierungen ausgeben
{
type = "path",
from = { data = "countries" },
properties =
{
enter = { path = { field = "path" } },
update = { fill = { field = "zipped.data.v" } },
hover = { fill = { value = "darkgrey" } } -- hat außerhalb der Vorschau keine Wirkung, daher kein Extra-Parameter
}
}
}
}
if (scales) then
output.scales = scales
output.marks[1].properties.update.fill.scale = "color"
end
return mw.text.jsonEncode(output)
end
return p