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

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

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

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

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

解決済

グラフの凡例をまとめたい

babaa
babaa

総合スコア3

Matplotlib

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

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

2回答

0グッド

0クリップ

236閲覧

投稿2022/10/16 05:56

前提

実験データからピークを算出し,それを物質ごとにグラフにプロットするプログラムを考えています.

実現したいこと

現在,物質ごとの座標をプロットするところまでは作ったのですが,グラフを確認するとすべての点で凡例が表示されてしまいます.理想は物質ごとに凡例をまとめたいです(SiO2, C, another一つずつ).いろいろググってみたのですが,やり方が分かりませんでした.

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

一つ一つの座標ごとに凡例が表示される.
イメージ説明

該当のソースコード

python

1import pandas as pd 2import numpy as np 3from scipy import signal 4import matplotlib.pyplot as plt 5import os 6 7 8file = pd.read_table( 9 "sample.txt", 10 comment="*", # コメント開始の文字を1文字で指定 11 encoding="shift-jis", # encoding は毎度明示的に指定したほうが良い 12 sep="\s+", # 空白区切りならこのように指定する 13 header=None 14) 15 16xx = file.iloc[:,0] 17file["Degree"]=xx 18yy = file.iloc[:,1] 19file["Height"]=yy 20 21#データの変換,signal.argrelmax()関数がPandasのSeriesやDataFrameに対応していないため 22x = np.array(xx) 23y = np.array(yy) 24 25maxid = signal.argrelmax(y, order=150) #極大値 orderを変えることでピークの検出が変わる(ピーク検出の閾値) 26#minid = signal.argrelmin(y, order=1) #極小値 27 28x_max = max(xx) 29y_max = max(yy) 30y_min = min(yy) 31x_min = min(xx) 32plt.figure(figsize=(10,4))#図のアスペクト比を変更(横×縦) 33 #棒グラフの図示 width=線の幅,デフォルトは0.8 34plt.bar(x,y, width=0.1) 35 36 #plt.plot((x, y), pltsize=(6,6)) 37plt.tick_params(labelsize = 9)#目盛りの数字の大きさを変更 38plt.ylim(y_min, y_max*1.1) # y 軸の範囲の設定, 39plt.xlim(30,65) # x 軸の範囲の設定 40 #plt.show() 41plt.xlabel("2θ" , fontsize = 10) 42 #plt.tight_layout() 43 44dfx = pd.Series(x[maxid]) 45dfy = pd.Series(y[maxid]) 46df = pd.DataFrame([dfx, dfy]) 47df = df.T 48df.columns = ['xmax', 'ymax'] 49 50i=0 51for i in range (0,len(df["xmax"])): 52 if 36.00 <= df.iloc[i, 0] <= 37.00 or 39.00 <= df.iloc[i, 0] <= 40.00 or 42.00 <= df.iloc[i, 0] <= 43.00 or 50.00 <= df.iloc[i, 0] <= 51.00 or 59.00 <= df.iloc[i, 0] <= 60.00: 53 dfx = df.iloc[i,0] #i行目のxmax 54 dfy = df.iloc[i,1] #i行目のymax 55 plt.plot(dfx,dfy,'o',label='SiO2',color='b') 56 i = i+1 57 58 elif 45.00 <= df.iloc[i, 0] <= 46.00 or 55.00 <= df.iloc[i, 0] <= 56.00 or 61.00 <= df.iloc[i, 0] <= 62.00: 59 dfx = df.iloc[i,0] #i行目のxmax 60 dfy = df.iloc[i,1] #i行目のymax 61 plt.plot(dfx,dfy,'o',label='C',color='g') 62 i = i+1 63 64 else: 65 dfx = df.iloc[i,0] 66 dfy = df.iloc[i,1] 67 plt.plot(dfx,dfy,'o',label='another',color='r') 68 i = i+1 69 70fig = plt.legend() 71 72print(maxid) 73plt.plot() #x軸とy軸を指定 74plt.savefig('C:\\python\\HSCVD\\XRD\\test1016-9.png') #保存 75plt.close('all')

試したこと

ググると

from matplotlib.legend_handler import HandlerTuple handler_map={tuple:HandlerTuple(ndivide=None)}

などの方法があると出てきたのですが,使い方が理解できませんでした.

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

ここにより詳細な情報を記載してください。

以下のような質問にはグッドを送りましょう

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

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

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

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

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

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

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

適切な質問に修正を依頼しましょう。

回答2

2

ベストアンサー

凡例のラベルを unique にするという方法もあるかと。

python

1handles, labels = plt.gca().get_legend_handles_labels() 2labels = dict(zip(labels, handles)) 3plt.legend(labels.values(), labels.keys())

投稿2022/10/16 06:24

melian

総合スコア16208

spoofy_dragon, ps_aux_grep👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

0

handler_map={tuple:HandlerTuple(ndivide=None)}を使うときは,次のようにすると良いでしょう.

Python

1plt.plot() 2plt.legend(labels=["SiO2", "C", "another"], handler_map={tuple:HandlerTuple(ndivide=None)})

うまくいかない場合は,応急的になりますが次のようにできます.plt.plot()するたびにラベルを指定していれば,凡例が生成されてしまうので,1度プロットしたカテゴリのものは2度目からはlabel = Noneにする方法があります.

Python

1show_sio2_label = True 2for i in range(): 3 if .......... 4 plt.plot(dfx,dfy,'o',label='SiO2' if show_sio2_label else None,color='b') 5 show_sio2_label = False

もしくはラベルごとにデータをまとめて一括表示する.ですかね.

投稿2022/10/16 06:08

編集2022/10/16 06:24
PondVillege

総合スコア1023

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

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

Matplotlib

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

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。