Ich habe eine Bibliothek (Japanmap) für ** Python3 ** erstellt, die die Karte Japans nach Präfektur farblich kodiert. Das Ausführungsbeispiel wird auf dem Jupyter-Notizbuch bestätigt.
Du kannst es mit pip machen. numpy [^ 1], OpenCV und Pillow sind ebenfalls installiert. xlrd wird zum Lesen von Excel-Dateien verwendet.
bash
pip install -U japanmap jupyter matplotlib pandas xlrd
Präfekturcode (im Folgenden als Präfekturcode abgekürzt) ist 01 für jede durch JIS X 0401 definierte Präfektur. Ab 47 Codes. Das Programm behandelt es als Ganzzahl (ignoriert die führende 0).
Sie finden den Präfekturnamen für jeden Präfekturcode mit pref_names.
python3
from japanmap import pref_names
pref_names[1]
>>>
'Hokkaido'
Den Präfekturcode für den Präfekturnamen finden Sie mit pref_code.
python3
from japanmap import pref_code
pref_code('Kyoto'), pref_code('Kyoto府')
>>>
(26, 26)
Sie finden den Präfekturcode für jede der acht regionalen Abteilungen in Gruppen.
python3
from japanmap import groups
groups['Kanto']
>>>
[8, 9, 10, 11, 12, 13, 14]
Sie können eine weiße Karte (Rasterdaten) mit Bild erhalten.
python3
%config InlineBackend.figure_formats = {'png', 'retina'}
%matplotlib inline
import matplotlib.pyplot as plt
from japanmap import picture
plt.rcParams['figure.figsize'] = 6, 6
plt.imshow(picture());
Sie können die Präfektur auch mit Farbe bemalen.
python3
plt.imshow(picture({'Hokkaido': 'blue'}));
Sie können es in einer Datei mit savefig
speichern.
python3
plt.imshow(picture({'Hokkaido': 'blue'}))
plt.savefig('japan.png')
Mit is_faced2sea können Sie sehen, ob der Bereich einschließlich des Bürostandorts für den Präfekturcode zum Meer zeigt.
python3
from japanmap import is_faced2sea
for i in [11, 26]:
print(pref_names[i], is_faced2sea(i))
>>>
Präfektur Saitama Falsch
Präfektur Kyoto stimmt
Mit is_sandwiched2sea können Sie sehen, ob der Bereich einschließlich des Bürostandorts für den Präfekturcode zwischen dem Meer liegt. (Gibt es zwei oder mehr nicht durchgehende Strände?)
python3
from japanmap import is_sandwiched2sea
for i in [2, 28]:
print(pref_names[i], is_sandwiched2sea(i))
>>>
Präfektur Aomori Falsch
Präfektur Hyogo stimmt
Angrenzend wird der Präfekturcode angezeigt, in dem der Bereich einschließlich des Standortes der Agentur neben dem Präfekturcode liegt.
python3
from japanmap import adjacent
for i in [2, 20]:
print(pref_names[i], ':', ' '.join([pref_names[j] for j in adjacent(i)]))
>>>
Präfektur Aomori:Präfektur Iwate Präfektur Akita
Präfektur Nagano:Präfektur Gunma Präfektur Saitama Präfektur Niigata Präfektur Toyama Präfektur Yamanashi Präfektur Gifu Präfektur Shizuoka Präfektur Aichi
Mit get_data können Sie die Punkteliste und die Punktindexliste jeder Präfektur abrufen. Sie können dies verwenden, um eine Liste der Präfekturgrenzen (Indexliste) mit pref_points abzurufen.
python3
from japanmap import get_data, pref_points
qpqo = get_data()
pnts = pref_points(qpqo)
pnts[0] #Grenzkoordinaten von Hokkaido(Längengrad Breitengrad)aufführen
>>>
[[140.47133887410146, 43.08302992960164],
[140.43751046098984, 43.13755540826223],
[140.3625317793531, 43.18162745988813],
...
Sie können die Randdaten mit pref_map visualisieren.
python3
from japanmap import pref_map
svg = pref_map(range(1,48), qpqo=qpqo, width=2.5)
svg
pref_map ist im SVG-Format. Sie können es wie folgt in einer Datei speichern.
python3
with open('japan.svg', 'w') as fp:
fp.write(svg.data)
Ein Beispiel für Graustufen nur in Kanto.
python3
pref_map(groups['Kanto'], cols='gray', qpqo=qpqo, width=2.5)
Konvertieren wir das Flächenverhältnis auf der Karte durch das Bevölkerungsverhältnis. Bevölkerungsdaten von "Ich sehe, Statistikakademie" des Statistikbüros des Ministeriums für innere Angelegenheiten und Kommunikation Drücken Sie 2017 auf "Source Statistics Table" am unteren Bildschirmrand Laden wir die Datei (a00400.xls) der Bevölkerung [^ 2] nach Präfektur herunter.
python3
import pandas as pd
df = pd.read_excel('a00400.xls', usecols=[9, 12, 13, 14], skiprows=18, skipfooter=3,
names='Präfektur Männer und Frauen insgesamt Männer und Frauen'.split()).set_index('Präfekturen')
df[:3]
Geschlecht insgesamt | Mann | Frau | |
---|---|---|---|
Präfekturen | |||
Hokkaido | 5320 | 2506 | 2814 |
Präfektur Aomori | 1278 | 600 | 678 |
Präfektur Iwate | 1255 | 604 | 651 |
Zeigen wir sie in absteigender Reihenfolge des Bevölkerungsverhältnisses an. "5,09", das Verhältnis von Tokio, entspricht dem 5,09-fachen des Präfektur-Durchschnitts.
python3
df['Verhältnis'] = df.Geschlecht insgesamt/ df.Geschlecht insgesamt.mean()
df.sort_values('Verhältnis', ascending=False)[:10]
Geschlecht insgesamt | Mann | Frau | Verhältnis | |
---|---|---|---|---|
Präfekturen | ||||
Tokio | 13724 | 6760 | 6964 | 5.090665 |
Präfektur Kanagawa | 9159 | 4569 | 4590 | 3.397362 |
Präfektur Osaka | 8823 | 4241 | 4583 | 3.272729 |
Präfektur Aichi | 7525 | 3764 | 3761 | 2.791260 |
Saitama | 7310 | 3648 | 3662 | 2.711510 |
Präfektur Chiba | 6246 | 3103 | 3143 | 2.316839 |
Präfektur Hyogo | 5503 | 2624 | 2879 | 2.041237 |
Hokkaido | 5320 | 2506 | 2814 | 1.973356 |
5107 | 2415 | 2692 | 1.894348 | |
3675 | 1810 | 1866 | 1.363174 |
python3
from japanmap import trans_area
qpqo = get_data(True, True, True)
pref_map(range(1,48), qpqo=trans_area(df.Präfektur Shizuoka Lassen Sie es uns visualisieren. Sie können die Fläche der Präfektur mit `trans_area` in das angegebene Verhältnis umwandeln. Wenn beispielsweise das Umwandlungsverhältnis für jede Präfektur "[2, 1, 1, 1, ...]" beträgt, hat Hokkaido die doppelte ursprüngliche Fläche und andere Präfekturen haben das gleiche Verhältnis wie die ursprüngliche Fläche. Im Folgenden wird die Fläche verdoppelt, wenn die Bevölkerung doppelt so hoch ist wie der Durchschnitt. Geschlecht insgesamt, qpqo), width=2.5)
Ich habe versucht, es rau zu machen und die Verzerrung so weit wie möglich zu reduzieren, aber es ist ziemlich schwerwiegend.
Mit den folgenden Schritten können Sie die Präfektur mit einer großen Population in Dunkelrot visualisieren.
python3
cmap = plt.get_cmap('Reds')
norm = plt.Normalize(vmin=df.Geschlecht insgesamt.min(), vmax=df.Geschlecht insgesamt.max())
fcol = lambda x: '#' + bytes(cmap(norm(x), bytes=True)[:3]).hex()
plt.colorbar(plt.cm.ScalarMappable(norm, cmap))
plt.imshow(picture(df.Geschlecht insgesamt.apply(fcol)));
Lösen Sie das 4-Farben-Problem mithilfe von Adjazenzinformationen Lass uns gehen.
Malen wir ganz Japan mit 4 Farben, so dass eine Präfektur eine Farbe ist und die benachbarten Präfekturen unterschiedlich sind. Das Problem, benachbarten Objekten auf diese Weise unterschiedliche Farben zuzuweisen, wird als Vertex-Farbproblem bezeichnet. Das Problem der Scheitelpunktfärbung besteht darin, den Scheitelpunkten mit der minimalen Anzahl von Farben Farben zuzuweisen, sodass benachbarte Scheitelpunkte im Diagramm unterschiedliche Farben haben. Als Anwendung hierfür besteht beispielsweise ein Problem beim Bestimmen der Frequenz für jede Basisstation eines Mobiltelefons. (Unterschiedliche Farben → unterschiedliche Frequenzen → Sie können sprechen, da die Funkwellen nicht stören)
Es wurde mathematisch bewiesen, dass unabhängig von der ebenen Karte die angrenzenden Bereiche unterschiedlich sind und die Farben immer innerhalb von 4 Farben liegen. Es ist jedoch nicht offensichtlich, wie sie separat zu malen sind. Hier lösen wir die mathematische Optimierung.
Die mathematische Optimierung wird verwendet, um Dinge wie die Kostenminimierung zu lösen, kann aber auch Probleme mit Einschränkungen ohne Zielfunktion lösen. Das für die mathematische Optimierung verwendete Paket PuLP finden Sie unter Python in Optimization.
Zum Ausführen benötigen Sie zusätzliches PuLP und ortoolpy (pip install pulp ortoolpy
).
python3
import pandas as pd
from ortoolpy import model_min, addbinvars, addvals
from pulp import lpSum
from japanmap import pref_names, adjacent, pref_map
m = model_min() #Mathematisches Modell(1)
df = pd.DataFrame([(i, pref_names[i], j) for i in range(1, 48) for j in range(4)],
columns=['Code', 'Präfektur', 'Farbe'])
addbinvars(df) #Variablentabelle(2)
for i in range(1, 48):
m += lpSum(df[df.Code == i].Var) == 1 #1 Präfektur 1 Farbe(3)
for j in adjacent(i):
for k in range(4): #Verschiedene Farben für benachbarte Präfekturen(4)
m += lpSum(df.query('Code.isin([@i, @j])und Farbe== @k').Var) <= 1
m.solve() #Lösung(5)
addvals(df) #Ergebniseinstellung(6)
Vier Farben= ['red', 'blue', 'green', 'yellow']
cols = df[df.Val > 0].Farbe.apply(四Farbe.__getitem__).reset_index(drop=True)
pref_map(range(1, 48), cols=cols, width=2.5)
[^ 1]: numpy ist eine Bibliothek linearer Algebra wie die Matrixberechnung. Als ähnliche Software wurde häufig MATLAB verwendet. Da sich numpy und MATLAB auf derselben Basis befinden, gibt es keinen großen Leistungsunterschied. Obwohl MATLAB aufgeladen ist, haben Python und Numpy den Vorteil, dass sie kostenlos verwendet werden können. [^ 2]: Tabelle 2 Präfektur, Geschlechterbevölkerung und Bevölkerungsverhältnis - Gesamtbevölkerung, japanische Bevölkerung (Stand 1. Oktober 2014) (Excel: 41 KB)
Recommended Posts