Aller au contenu

Module:Graph

Cette page fait l’objet d’une mesure de semi-protection étendue.
Une page de Wikipédia, l'encyclopédie libre.
Ceci est une version archivée de cette page, en date du 2 juin 2015 à 20:12 et modifiée en dernier par Mps (discuter | contributions) (AZ: Die Seite wurde neu angelegt: local p = {} function p.map(frame) -- Kartendaten local map = mw.title.new(frame.args.map or "Wikip…). Elle peut contenir des erreurs, des inexactitudes ou des contenus vandalisés non présents dans la version actuelle.
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)

 Documentation[voir] [modifier] [historique] [purger]

Utilisation

Fonctions exportables :

  • fonction(frame) – description (courte description de fonction(frame) et autres informations pertinentes).
  • fonction2() – description2 (courte description de fonction2() et autres informations pertinentes).

Autres fonctions :

  • fonction() – description2 (courte description de fonction() et autres informations pertinentes).

Modules externes et autres éléments dont ce module a besoin pour fonctionner :

  • mw.title – description (courte description expliquant la dépendance de ce module externe).

Exemples

Pour des exemples, voir la page de test[Où ?] permettant de tester diverses modifications apportées. Voir aussi {{Graph:Lines}} et {{Graph:Chart}}, qui sont les modèles utilisant le module.

Test 1

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