前提
実験データからピークを算出し,それを物質ごとにグラフにプロットするプログラムを考えています.
実現したいこと
現在,物質ごとの座標をプロットするところまでは作ったのですが,グラフを確認するとすべての点で凡例が表示されてしまいます.理想は物質ごとに凡例をまとめたいです(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/ツールのバージョンなど)
ここにより詳細な情報を記載してください。

回答2件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。