質問するログイン新規登録
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

788閲覧

Pythonのjapanmapで日本地図を描画したのですが、地図が実際のデータとリンクしていません。

travel_every

総合スコア1

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

2クリップ

投稿2025/07/08 05:34

0

2

実現したいこと

2024年に行われた衆院選における投票率を都道府県別にまとめたデータを視覚化したい。

発生している問題・分からないこと

Pythonのjapanmapライブラリと総務省のデータを加工したCSVファイルを用いて、都道府県別の投票率を表現した日本地図を描画したのですが、これが実際のデータと合っていません。
データと実際に描画した日本地図の画像を添付します。
イメージ説明
イメージ説明
例えば山形県の投票率は60%を超えているので、本来であれば濃い赤色で表現されるべき所ですが、なぜか薄い赤色になっています。このように、描画された地図が実際のデータとリンクしていないという状況です。

エラーメッセージ

error

1エラーメッセージは出ていませんが、地図が正しく出力されていません。

該当のソースコード

Python

1!pip install japanmap 2!pip install japanize_matplotlib 3import matplotlib.pyplot as plt 4import pandas as pd 5 6data_df = pd.read_csv('/content/todouhuken_touhyouritsu.csv') 7 8from japanmap import picture 9import japanize_matplotlib 10cmap = plt.get_cmap("Reds") 11norm = plt.Normalize(vmin=data_df['計'].min(), vmax=data_df['計'].max()) 12fcol = lambda x: "#" + bytes(cmap(norm(x), bytes=True)[:3]).hex() 13pic = picture(data_df['計'].apply(fcol)) 14plt.title('第50回衆院選(2024)都道府県別投票率(比例代表)') 15plt.colorbar(plt.imshow(pic, cmap, norm)) 16plt.savefig(f"第50回衆院選(2024)投票率(比例代表).png") 17plt.show()

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

Googleでjapanmapを使っている方の記事を調べましたが、私の事例のように地図とデータの整合性が取れていない例を見つけることができず、解決には至りませんでした。

補足

特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bsdfan

2025/07/08 09:57

解決済みになっていますが、本当に正しくプロットできていますか? 元データが画像の通りだとすると、都道府県コードの順に並んでいないので、神奈川〜福井あたりのデータが違う場所にプロットされているんじゃないでしょうか。 picture(data_df.set_index('都道府県')['計'].apply(fcol)) と、都道府県名をインデックスにするのがいいと思います。
travel_every

2025/07/08 10:20

ありがとうございます。 確かに神奈川は実際の投票率よりも色が濃いように見えますね。 都道府県名をインデックスにしてみたのですが、そうすると地図が真っ白になってしまいました。 データを都道府県コードの順に並べ直した所、正しく表示されました。
bsdfan

2025/07/19 00:57

回答のほうでやりとりが続いているようなのでコメント追加します。 japanmap.picture() は dict like (items() がイテレータを返すもの)を受け取るので pandas の Series でも大丈夫です。そのときのキー(Seriesの場合はインデックス)は整数(都道府県コード)もしくは文字列(都道府県名)です。 なので、「都道府県」列をインデックスにするとちゃんと描画できると思うのですが、白地図になるということは、「都道府県」列がちゃんと都道府県名になっていないんだろうと思います。空白が入ってたり、不可視コードがまぎれてたりという可能性があります。このあたりは実際のデータでしか確認できないので、質問者さんが気になるのなら調べられたらいいと思います。 都道府県コード順に並べてちゃんとできたのなら、それでいいと思います。
melian

2025/07/19 01:46

bsdfanさん > 白地図になるということは、「都道府県」列がちゃんと都道府県名になっていないんだろうと思います。空白が入ってたり、不可視コードがまぎれてたりという可能性があります。 総務省のデータを見ますと、たしかに都道府県名(データ上は「区 分」列)の先頭に空白(スペース)が入っています。 令和6年10月27日執行 衆議院議員総選挙・最高裁判所裁判官国民審査 速報結果 (2)-2 都道府県別投票率(比例代表) https://www.soumu.go.jp/main_content/000979121.xls 質問に貼られている Excel の表でもスペースが入っている様に見えます。私の場合、このデータからCSVに変換する際に先頭と末尾にあるスペースを取り除いたので問題が発生しなかったのだと思います。 > travel_everyさん なので、Pandas の read_csv() に skipinitialspace=True を指定して実行してみてください。(文字列の先頭にあるスペースを除去した状態で読み込みます) data_df = pd.read_csv('todouhuken_touhyouritsu.csv', index_col='都道府県', skipinitialspace=True)
travel_every

2025/07/19 04:21

bsdfanさん、melianさん ありがとうございます。 read_csv() に skipinitialspace=Trueを指定して実行してみた所、色の付いた地図が出力されました。
guest

回答2

0

ベストアンサー

japanmap の picture 関数のソースコードを確認してみると、 i = k if isinstance(k, int) else pref_code(k): となっています。

japanmap/src/japanmap/init.py at master · SaitoTsutomu/japanmap

python

1def picture(dic=None, rate=1): 2 : 3 4 if hasattr(dic, "items"): 5 for k, v in dic.items(): 6 i = k if isinstance(k, int) else pref_code(k) 7 if 1 <= i <= NUM_PREF: 8 c = tuple(int(t * rate) for t in v) if isinstance(v, tuple) else getrgb(v) 9 floodFill(p, None, (pos[i][0] * 10, pos[i][1] * 10), c) 10 return p

なので、データフレームのインデックスを都道府県にするとよいかと思います。(pref_code(k)で対応する都道府県コードに変換されます)

python

1data_df = pd.read_csv('todouhuken_touhyouritsu.csv', index_col='都道府県')

イメージ説明

投稿2025/07/08 07:25

編集2025/07/08 17:28
melian

総合スコア21430

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

travel_every

2025/07/08 07:27

回答ありがとうございます。 試してみたら、無事正しい地図が描画されました。ありがとうございました!
melian

2025/07/08 17:29

すみません、都道府県名から都道府県コードに変換される様に修正しました。
travel_every

2025/07/08 22:16

ありがとうございます。データフレームのインデックスを都道府県にすると、地図に色がつかず白地図になってしまいます。
melian

2025/07/09 01:22

白地図になってしまうのですね。。。確認ですが、data_df = pd.read_csv('todouhuken_touhyouritsu.csv', index_col='都道府県') で読み込んだデータフレームは以下の様になっていますでしょうか?      男   女   計 都道府県           北海道  56.96 55.43 56.15 青森県  52.66 50.67 51.60 岩手県  56.50 54.67 55.54      : 鹿児島県 54.22 52.84 53.49 沖縄県  49.91 49.95 49.93
travel_every

2025/07/17 07:21

申し訳ございません。コメントの返信をいただいていたのを気づいていませんでした。 データフレームはコメントで書かれていただいているような形で合っています。
guest

0

都道府県番号が1つずつずれています。1が北海道、47が沖縄県にならないといけないはず。
pandasでcsvで読み込ませるときにヘッダを飛ばさないとだめです。

https://qiita.com/yuba/items/d09e387a1ec191eb2738

ファイルパスだけ読み込んだ場合、ヘッダは付与されます。

投稿2025/07/17 06:58

FKM

総合スコア3668

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

travel_every

2025/07/17 07:19

回答ありがとうございます。確認させていただきます。
melian

2025/07/17 07:37

> travel_every さん 質問欄にある Excel スプレッドシートの都道府県の順序と、japanmapライブラリ内部で規定されている都道府県の順序が異なっています。 そのため、質問のコメントでtravel_every さんが述べた様にデータを都道府県コードの順序で並べる替える必要があります。 > データを都道府県コードの順に並べ直した所、正しく表示されました。 私の回答の様に都道府県をインデックスにすればよいはずなのですが、travel_every さんの環境では白地図になってしまう原因については解らないままです……
travel_every

2025/07/17 20:47

ありがとうございます。改めて確認してみましたが、やはり白地図になってしまいます。 ちなみに環境はGoogle Colabです。
FKM

2025/07/18 00:04

試したライブラリは公式でDLしたそのままになっていますか?他の方は内部エラー指摘して、そっちで白地図化されてしまったってことは、その編集は差し戻す必要があります。
travel_every

2025/07/18 04:50

コメントありがとうございます。japanmapのライブラリはそのままになっています。
FKM

2025/07/18 08:57 編集

melian氏の回答も含めてソースごと見直してみました。元のライブラリはpandasで読み込ませることを想定していないようなので、そこを調整する必要がありますね。 まずmelian氏の回答に即して。index_col="都道府県"はcsvのヘッダ名称からpandasの取得カラムを絞り込む手法です。したがってiindex_colを都道府県コードとした場合は、それを読み取るcsvのヘッダ情報もそれに合わせる必要がありますが、そこは大丈夫ですか? またjapanmap pandasで検索してみれば https://dev.classmethod.jp/articles/python-japanmap/ のように、ヘッダ処理を想定して行をスキップさせる方法もあるようです(ソースを見ると、japanmap側も先頭アドレス[0]がヘッダを想定しているので明示的にデータ開始位置を2行ずらしている)。
melian

2025/07/19 01:49

> travel_every さん 質問のコメントに書きましたが、bsdfan さんの指摘している通りに都道府県名の先頭にスペースが入っていることが原因の様です。対処方法を書いておきましたのでご確認ください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問