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

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

ただいまの
回答率

88.91%

散布図に凡例を付けたい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 313

Male_soprano

score 8

前提・実現したいこと

Python初心者です.

凡例付きの散布図を作ろうとしたのですが,プロットに凡例(C列)を紐付ける方法が分かりません.
又,このデータは別のデータを大幅に改変・縮小したもので,C列の要素を手打ちする事なく分類・描画・着色できれば,と考えています.

解決の一例を示していただけますと幸いです.宜しくお願いします.

現状

イメージ説明

該当のソースコード

import matplotlib.pyplot as plt
import pandas as pd

df_plot=pd.read_csv("Practice2.csv")

plt.xlim(4, 10) # x軸の表示範囲
plt.ylim(8, 14) # y軸の表示範囲
plt.title("Graph", fontsize=10) # タイトル
plt.xlabel("X axis", fontsize=10) # x軸ラベル
plt.ylabel("Y axis", fontsize=10) # y軸ラベル
plt.grid(True) # 目盛線の表示
plt.tick_params(labelsize = 10) # 目盛線のラベルサイズ

# グラフの描画
plt.scatter(df_plot["A"], df_plot["B"], s=50, c="b", marker="D", alpha=0.5) #散布図の描画
plt.legend(df_plot["C"], loc="lower right", fontsize=10)#凡例
plt.show()

practice.csv
A,B,C
4.68,11.85431,Tanaka
4.73,12.50193,Sato
4.87,12.52497,Sato

追加情報

macOS10.15.4, Python3

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • meg_

    2020/07/09 21:47

    日本語を表示させるには日本語フォントを指定しましょう。「matplotlib 日本語」などで検索すれば方法は見つかります。

    キャンセル

  • Male_soprano

    2020/07/10 09:25

    有難うございます.実は質問を送信する前に気付いて変更しましたが,変更が反映されなかったようです.
    問題文を訂正しましたので,ご確認いただけますと幸いです.宜しくお願いします.

    キャンセル

  • meg_

    2020/07/10 11:00

    新しい画像でも凡例が文字化けしているように見えます。

    キャンセル

  • Male_soprano

    2020/07/10 13:03

    データを差し替えました.ご確認いただけますと幸いです.

    キャンセル

回答 2

checkベストアンサー

+1

matplotlib のデフォルトフォントは英字フォントなので、日本語は表示できません。

以下の手順で日本語フォントを設定すれば、反映されます。
(Jupyter Notebook の場合、Notebook を再起動してください)

matplotlib - コピペするだけで matplotlib を日本語化する方法 (Windows / Ubuntu 対応) - pystyle

追記

点ごとに凡例を用意するということでしょうか?

import matplotlib.pyplot as plt
import pandas as pd

df = pd.read_csv("sample.csv")

plt.xlim(4, 10)  # x軸の表示範囲
plt.ylim(8, 14)  # y軸の表示範囲
plt.title("Graph", fontsize=10)  # タイトル
plt.xlabel("X axis", fontsize=10)  # x軸ラベル
plt.ylabel("Y axis", fontsize=10)  # y軸ラベル
plt.grid(True)  # 目盛線の表示
plt.tick_params(labelsize=10)  # 目盛線のラベルサイズ

# グラフの描画
for row in df.itertuples():
    plt.scatter(row.A, row.B, s=50, marker="D", alpha=0.7, label=row.C)

plt.legend(loc="lower right", fontsize=10)
plt.show()

イメージ説明

追記

seaborn.scatterplot() を使うと簡単です。
seaborn は pip install seaborn でインストールできます。

使い方

seaborn.scatterplot(x="X座標の列名", y="Y座標の列名", hue="凡例の列名", data=DataFrame の変数, ax=ax)

seaborn.scatterplot — seaborn 0.10.1 documentation

↓ サンプルコード

import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns

df = pd.read_csv("sample.csv")

fig, ax = plt.subplots()
ax.set_xlim(4, 10)  # x軸の表示範囲
ax.set_ylim(8, 14)  # y軸の表示範囲
ax.set_title("Graph", fontsize=10)  # タイトル
ax.set_xlabel("X axis", fontsize=10)  # x軸ラベル
ax.set_ylabel("Y axis", fontsize=10)  # y軸ラベル
ax.grid()  # 目盛線の表示
ax.tick_params(labelsize=10)  # 目盛線のラベルサイズ

sns.scatterplot(x="A", y="B", hue="C", data=df, ax=ax)

plt.show()

イメージ説明

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/10 13:08

    例えばSato(データを差し替えました)でも,上記の緑の凡例が消えて,緑のプロットも黄色になっていたら嬉しいです
    高次の生物分類毎の生体分子の性質を可視化したいので,区別できていなくても大丈夫です

    キャンセル

  • 2020/07/10 21:09

    意味がわかりました。C列の値が同じ凡例は統一したいということですね。
    追記したように seaborn.scatterplot() を使うと簡単にできます。
    seaborn は matplotlib を DataFrame の描画用に使いやすくしたライブラリです。

    キャンセル

  • 2020/07/11 00:59

    分かりました.有難うございます!

    キャンセル

+1

plt.xlim(4, 10) # x軸の表示範囲
plt.ylim(8, 14) # y軸の表示範囲
plt.title("Graph", fontsize=10) # タイトル
plt.xlabel("X axis", fontsize=10) # x軸ラベル
plt.ylabel("Y axis", fontsize=10) # y軸ラベル
plt.grid(True) # 目盛線の表示
plt.tick_params(labelsize = 10) # 目盛線のラベルサイズ

# グラフの描画
for i, name in enumerate(df_plot["C"].unique()):
    plt.scatter(df_plot.loc[df_plot["C"] == name, "A"], df_plot.loc[df_plot["C"] == name, "B"], s=50, c=[plt.get_cmap('tab10').colors[i]], marker="D", alpha=0.5)

plt.legend(df_plot["C"], loc="lower right", fontsize=10)#凡例
plt.show()


イメージ説明

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/11 01:00

    有難うございます!

    キャンセル

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

  • ただいまの回答率 88.91%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る