質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python 3.x

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

Python

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

Q&A

解決済

1回答

1056閲覧

Pythonでリストに格納された質的データを用いて散布図を描く方法について

退会済みユーザー

退会済みユーザー

総合スコア0

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2018/07/13 11:08

編集2018/07/13 12:06

前提・実現したいこと

出生地と現在住地のような組み合わせのリストを
以下のような散布図にして可視化しようとしています。

born_live = [('gunma', 'tokyo'), ('tochigi', 'hokkaido') , ('tokyo', 'tokyo'), ('nagano', 'nagano'), ('miyazaki', 'fukuoka')]

イメージ説明

発生している問題・エラーメッセージ

現在のコードでは以下のようにグラフが描画されていますが、
x軸とy軸を同じラベルにして、リストに格納された(x軸の都道府県名, y軸の都道府県名)を
座標とした実現したいことの画像のようにグラフを作成する方法がわかりません。
イメージ説明

該当のソースコード

python

1import matplotlib.pyplot as plt 2 3born_live = [('gunma', 'tokyo'), ('tochigi', 'hokkaido') , ('tokyo', 'tokyo'), ('nagano', 'nagano'), ('miyazaki', 'fukuoka')] 4 5# 都道府県のリスト作成 6pref = [d for d in set(sum(map(list, born_live), []))] 7 8x = [pref.index(x) for x,y in born_live] 9y = [pref.index(y) for x,y in born_live] 10 11plt.xticks(range(len(pref)), pref) 12plt.yticks(range(len(pref)), pref) 13plt.scatter(x,y) 14plt.show()

試したこと

リストを使いたいのですが、まずはX軸とY軸を描画するために、
以下のコードを実行しました。

python

1import matplotlib.pyplot as plt 2 3born_live = [('gunma', 'tokyo'), ('tochigi', 'hokkaido') , ('tokyo', 'tokyo'), ('nagano', 'nagano'), ('miyazaki', 'fukuoka')] 4 5# 都道府県のリスト作成 6pref = [d for d in set(sum(map(list, born_live), []))] 7 8x = ['hokkaido', 'gunma', 'tochigi', 'tokyo', 'nagano', 'miyazaki', 'fukuoka'] 9y = ['hokkaido', 'gunma', 'tochigi', 'tokyo', 'nagano', 'miyazaki', 'fukuoka'] 10 11plt.xticks(range(len(pref)), pref) 12plt.yticks(range(len(pref)), pref) 13plt.scatter(x,y) 14plt.show()

イメージ説明

この時点で、入力したX軸・Y軸の要素の順番が異なるのですが、
更に、以下のようにリストと同じようにプロットを打とうとしたところ、
エラーが出力されてしまっている状態です。

python

1import matplotlib.pyplot as plt 2 3born_live = [('gunma', 'tokyo'), ('tochigi', 'hokkaido') , ('tokyo', 'tokyo'), ('nagano', 'nagano'), ('miyazaki', 'fukuoka')] 4 5# 都道府県のリスト作成 6pref = [d for d in set(sum(map(list, born_live), []))] 7 8x = ['hokkaido', 'gunma', 'tochigi', 'tokyo', 'nagano', 'miyazaki', 'fukuoka'] 9y = [None, 'tokyo', 'hokkaido', 'tokyo', 'nagano', 'fukuoka', None] 10 11plt.xticks(range(len(pref)), pref) 12plt.yticks(range(len(pref)), pref) 13plt.scatter(x,y) 14plt.show()

エラー文

-------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-4-457a837ce2d3> in <module>() 11 plt.xticks(range(len(pref)), pref) 12 plt.yticks(range(len(pref)), pref) ---> 13 plt.scatter(x,y) 14 plt.show() ~/.pyenv/versions/anaconda3-5.0.1/lib/python3.6/site-packages/matplotlib/pyplot.py in scatter(x, y, s, c, marker, cmap, norm, vmin, vmax, alpha, linewidths, verts, edgecolors, hold, data, **kwargs) 3355 vmin=vmin, vmax=vmax, alpha=alpha, 3356 linewidths=linewidths, verts=verts, -> 3357 edgecolors=edgecolors, data=data, **kwargs) 3358 finally: 3359 ax._hold = washold ~/.pyenv/versions/anaconda3-5.0.1/lib/python3.6/site-packages/matplotlib/__init__.py in inner(ax, *args, **kwargs) 1708 warnings.warn(msg % (label_namer, func.__name__), 1709 RuntimeWarning, stacklevel=2) -> 1710 return func(ax, *args, **kwargs) 1711 pre_doc = inner.__doc__ 1712 if pre_doc is None: ~/.pyenv/versions/anaconda3-5.0.1/lib/python3.6/site-packages/matplotlib/axes/_axes.py in scatter(self, x, y, s, c, marker, cmap, norm, vmin, vmax, alpha, linewidths, verts, edgecolors, **kwargs) 4094 offsets=offsets, 4095 transOffset=kwargs.pop('transform', self.transData), -> 4096 alpha=alpha 4097 ) 4098 collection.set_transform(mtransforms.IdentityTransform()) ~/.pyenv/versions/anaconda3-5.0.1/lib/python3.6/site-packages/matplotlib/collections.py in __init__(self, paths, sizes, **kwargs) 859 """ 860 --> 861 Collection.__init__(self, **kwargs) 862 self.set_paths(paths) 863 self.set_sizes(sizes) ~/.pyenv/versions/anaconda3-5.0.1/lib/python3.6/site-packages/matplotlib/collections.py in __init__(self, edgecolors, facecolors, linewidths, linestyles, antialiaseds, offsets, transOffset, norm, cmap, pickradius, hatch, urls, offset_position, zorder, **kwargs) 147 self._uniform_offsets = None 148 if offsets is not None: --> 149 offsets = np.asanyarray(offsets, float) 150 # Broadcast (2,) -> (1, 2) but nothing else. 151 if offsets.shape == (2,): ~/.pyenv/versions/anaconda3-5.0.1/lib/python3.6/site-packages/numpy/core/numeric.py in asanyarray(a, dtype, order) 581 582 """ --> 583 return array(a, dtype, copy=False, order=order, subok=True) 584 585 ValueError: could not convert string to float: 'fukuoka'

補足情報(FW/ツールのバージョンなど)

Python 3.6
Jupyter notebook 5.0.0

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

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

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

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

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

guest

回答1

0

ベストアンサー

ん?
つい最近同じような質問に答えた記憶が・・。

とりあえず、カテゴリーデータを数値化してplot、X軸とY軸は数値に対応したカテゴリーを表示するで描画できます。

Python

1import matplotlib.pyplot as plt 2 3born_live = [('gunma', 'tokyo'), ('tochigi', 'hokkaido') , ('tokyo', 'tokyo'), ('nagano', 'nagano'), ('miyazaki', 'fukuoka')] 4 5# 都道府県のリスト作成 6pref = [d for d in set(sum(map(list, born_live), []))] 7 8x = [pref.index(x) for x,y in born_live] 9y = [pref.index(y) for x,y in born_live] 10 11plt.xticks(range(len(pref)), pref) 12plt.yticks(range(len(pref)), pref) 13plt.scatter(x,y) 14plt.show()

【追記】

以下を修正してみました

  • 都道府県リストはborn_liveから生成するではなくて固定のものを使用
  • X軸 Y軸共に範囲を指定
  • X軸のtickを90度回転

Python

1import matplotlib.pyplot as plt 2 3born_live = [('gunma', 'tokyo'), ('tochigi', 'hokkaido') , ('tokyo', 'tokyo'), ('nagano', 'nagano'), ('miyazaki', 'fukuoka')] 4 5# 都道府県のリストは既知 6pref = ['hokkaido', 'gunma', 'tochigi', 'tokyo' , 'nagano', 'fukuoka', 'miyazaki', 'okinawa'] 7 8x = [pref.index(x) for x,y in born_live] 9y = [pref.index(y) for x,y in born_live] 10 11plt.scatter(x,y) 12plt.xticks(range(len(pref)), pref, rotation='vertical') 13plt.yticks(range(len(pref)), pref) 14plt.xlim(0, len(pref)-1) # X軸の範囲を指定 15plt.ylim(0, len(pref)-1) # Y軸の範囲を指定 16plt.tight_layout() 17plt.show()

投稿2018/07/13 11:16

編集2018/07/13 12:11
magichan

総合スコア15898

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

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

退会済みユーザー

退会済みユーザー

2018/07/13 11:52

ご回答ありがとうございます。 前回ご回答いただいた質問と似ておりますが、 X軸とY軸のラベルの順番を変更してプロットを打ちたい場合について 今回質問させていただきました。 試したことに追記させていただきます。
magichan

2018/07/13 12:13

質問の意図をちゃんと汲み取れているかわからないのですが、とりあえずコードを修正してみました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問