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

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

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

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

NumPy

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

Python

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

pandas

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

Q&A

解決済

2回答

691閲覧

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

babaa

総合スコア4

Matplotlib

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

NumPy

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

Python

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

pandas

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

0グッド

0クリップ

投稿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/ツールのバージョンなど)

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

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

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

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

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

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

guest

回答2

0

ベストアンサー

凡例のラベルを 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

総合スコア19849

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

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

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

総合スコア1579

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問