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

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

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

R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

Matplotlib

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

Python

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

pandas

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

Q&A

解決済

1回答

1196閲覧

matplotlib Axesのパラメータについて

nudesudesu

総合スコア8

R

R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

Matplotlib

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

Python

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

pandas

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

0グッド

0クリップ

投稿2021/08/11 09:18

編集2021/08/11 09:23

Python勉強中の大学生です。
FacetGridを使って複数軸のPlotに挑戦しています。
https://seaborn.pydata.org/generated/seaborn.FacetGrid.html
こちらのサイトを参考にしているのですが、Hueを使ってデータを男女に分けた場合に、サイトに記載の関数Annotateが上手く動かず困っています。

import matplotlib.pyplot as plt tips = sns.load_dataset("tips") def annotate(data, **kws): n = len(data) ax = plt.gca() ax.text(.1, .6, f"N = {n}", transform=ax.transAxes) g = sns.FacetGrid(tips, row='smoker',col="time",hue='sex') g.map_dataframe(sns.scatterplot, x="total_bill", y="tip") g.set_axis_labels("Total bill", "Tip") g.map_dataframe(annotate)

上記を実行した結果、下図のようにHue毎にカウント件数が出力されているようですが、重なって見えなくなってしまいました。

イメージ説明

import matplotlib.pyplot as plt tips = sns.load_dataset("tips") def annotate(data, **kws): n = len(data) ax = plt.gca() ax.annotate(f"N = {n}", xy=(0.5, (n/100)+0.5), xycoords=ax.transAxes, xytext=(10, 10), textcoords='offset points', ) g = sns.FacetGrid(tips, row='smoker',col="time",hue='sex') g.map_dataframe(sns.scatterplot, x="total_bill", y="tip") g.set_axis_labels("Total bill", "Tip") g.map_dataframe(annotate)

仕組みがよくわかっていないまま、 調べたら textcoords にoffset pointsを与えてずらせるような記述があったので、上記のように試したのですが、うまくいきませんでした。無理やりではあるのですが、データ確認のために、座標にCount件数の割合をぶつけた結果なんとか別れて出力できたのですが、これだとどっちが男性、女性のデータかわかりませんし、座標も思うように固定したいです。
イメージ説明

以上説明が下手で恐縮ですが、
①Hueごとにカウントを表示する方法(N=のところで男性女性かわかるようにする)
textcoords='offset points'の正しい使い方(綺麗に並べて表示できるようにする)

にはどうしたらよいでしょうか?

補足

g = sns.FacetGrid(tips, row='smoker',col="time",hue='sex')

ではなく、

g.map_dataframe(sns.scatterplot, x="total_bill", y="tip",hue='sex')

こっちでやる方法も試したのですが、こちらはLegendが正しくされなかったりと公式が推奨していない方法らしいので一旦上の方で解決したいです。。すみません。

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

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

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

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

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

guest

回答1

0

ベストアンサー

①Hueごとにカウントを表示する方法(N=のところで男性女性かわかるようにする)

以下の処理を行う必要があります。

  • annotate関数内で、現在処理しているのが男性のデータか女性のデータかを判断する
  • 男性か女性かに応じて、"N = n" の表示位置を下に(もしくは上に)ずらし、重ならないようにする。
  • (それだけでは男性か女性かは分からないので)たとえば男性のときは "N = n (Male)"、女性のときは "N = n (Female)" などと表示するようにする
  • あるいは、男性と女性のグラフ色に合わせて、文字色を変更する

以下がプログラム例です。
簡易な方法が用意されているわけではないので、あくまで一例です。これが正しいやり方というわけではありません。

python

1import matplotlib.pyplot as plt 2import seaborn as sns 3 4tips = sns.load_dataset("tips") 5 6def annotate(data, **kws): 7 n = len(data) 8 ax = plt.gca() 9 facecolor = {} 10 for collection in ax.collections: 11 facecolor[collection.get_label()] = collection.get_facecolor()[0] 12 if data['sex'].unique()[0] == "Male": 13 ax.text(.1, .8, f"N = {n} (Male)", transform=ax.transAxes, color=facecolor['Male']) 14 else: 15 ax.text(.1, .7, f"N = {n} (Female)", transform=ax.transAxes, color=facecolor['Female']) 16 17g = sns.FacetGrid(tips, row='smoker', col="time", hue='sex') 18g.map_dataframe(sns.scatterplot, x="total_bill", y="tip") 19g.map_dataframe(annotate) 20g.set_axis_labels("Total bill", "Tip") 21g.add_legend() 22g.tight_layout() 23plt.show()

イメージ説明


② textcoords='offset points'の正しい使い方(綺麗に並べて表示できるようにする)

textcoordsは、matplotlib.axes.Axes.annotate()メソッドで使うキーワード引数です。
参考にされたサイトで使われているのはmatplotlib.axes.Axes.text()メソッドです。

text() メソッドと annotate() メソッドの主な違いは、

  • text() はグラフ内に文字を描画するメソッド
  • annotate() は、グラフ内に文字を描画するのは同じだが、注釈・コメント文字列の描画に特化したメソッド
  • annotate() では、文字列とその位置だけではなく、注釈・コメントの対象となる「場所」の位置も指定する
  • annotate() では、注釈・コメントの対象となる場所と、注釈・コメント文字列を、矢印で結んだりすることができる

annotate() メソッドの textcoords キーワード引数は、注釈・コメント文字列の位置の指定のための方法を、指定するためのものです。
例えばtextcoords='offset points'とした場合は、注釈・コメントの対象となる場所からの、相対的な位置をポイントで指定することによって、文字列の位置を特定します。

詳細は公式ドキュメントを参照してください。
Annotations — Matplotlib 3.4.2 documentation
matplotlib.axes.Axes.annotate — Matplotlib 3.4.2 documentation

今回の目的のために使えるようなものではありませんので、上記のプログラム例では使用していません。

投稿2021/08/13 00:49

etherbeg

総合スコア1195

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問