77575


[早く知っておきたかったmatplotlibの基礎知識、あるいは見た目の調整が捗るArtistの話 -
Qiita](https://qiita.com/skotaro/items/08dc0b8c5704c94eafb9)  
を読んでいます。

> print('ax.xaxis:', ax.xaxis)

となっており、私も実際に下記のコードを書いて動くことを確かめました。

[code]

    fig = plt.figure()
    ax = fig.add_subplot(1,1,1)
    print('ax.xaxis:', ax.xaxis)
    
[/code]

結果:

[code]

    ax.xaxis: XAxis(54.0,36.0)
    
[/code]

より詳細なことを見に行こうと

<https://matplotlib.org/stable/api/axes_api.html>

を見たところ

[code]

    Attributes: 
      dataLimBbox:
        The bounding box enclosing all data displayed in the Axes.
    
      viewLimBbox:
         The view limits in data coordinates.
    
[/code]

となっており、てっきり Attributes に `XAxis` についての記述があるかと思ったのですが載っていません。

親クラスは、`_AxesBase` のようですが、ソースコードが掲載されているページしか見つけられませんでした。  
<https://matplotlib.org/stable/_modules/matplotlib/axes/_base.html>

また参考資料に下記のように`AxesSubplot`についての言及があります。

> AxesSubplotはplt.subplotsで作った場合のAxesオブジェクトと思って問題ありません。

この`AxesSubplot`ドキュメントなら何か記載があるかと思ったのですが、ドキュメントどころかソースコードのページも見つかりません（もしかしたらGitHubをあされば見つかるのかも？）

そもそも、実際に私も色々表示させてみると `AxesSubplot` というは見たことありますが、`Axes`と表示されているのは見たことがありません。

オブジェクトが持っているインスタンス変数やメソッドの一覧が見れないと、ソースコードを書くのが結構きついです。  
ドキュメントにどこか記載されていないものでしょうか？

質問タイトルについて:  
よく使われる変数名`ax`に本来は`AxesSubplot`が入っているのでしょうが、`AxesSubplot`と`Axes`の違いも理解があやふやなので、なんと書いていいかわからず、一般的に使われている変数名`ax`を使用しています。

* * *

追記：  
質問背景としては、x軸の設定方法が`ax`から直接する方法と、`ax`の`xaxis`を使う方法の2種類の方法がネットにあるようだからです。

例1

[code]

    import pandas as pd
    import matplotlib.pyplot as plt
    import seaborn as sns
        
    tips = sns.load_dataset('tips')
    count_df = tips.groupby('day').day.count().to_frame('count').reset_index()
    
    ax = count_df.plot.bar()
    ax.set_xticklabels(count_df.day) # <--- axから直接ティックラベル設定
    
[/code]

例2

[code]

    ...
    ax.xaxis.set_ticklabels(count_df.day) # <--- axのxaxisからティックラベル設定
    ...
    
[/code]

さらにgetterでxaxisを取得して設定する 例3（この方法はネットで見かけたことがない気がする）

[code]

    ...
    ax.get_xaxis().set_ticklabels(count_df.day)  # <--- getterで取得してからティックラベル設定
    ...
    
[/code]

`オブジェクト指向インタフェース`というからにはオブジェクトごとに役割が決まっているのかと思ったのですが、`ax`から直接X軸の設定ができたり混乱する要素が多いです（まあこれはこれでそこまで変な設計ではないと思いますが）。

私にはプロパティでX軸にアクセスする `ax.xaxis.set_ticklabels(count_df.day)`
の書き方が、1番自然と感じられたのですが、ドキュメントには
`xaxis`プロパティの記載がなく、このように`xaxis`プロパティに直接アクセスしていいもののか？とすこし疑問に思ったからです（ドキュメントに記載がなくてもアクサスできちゃうのであればアクセスしても何の問題もないとは思いますが）。

きっと、私がまだ`matplotlib`のドキュメントに慣れておらず、`AxesSubplot`のドキュメント（あるのであれば）や、`_AxesBase`といった親クラスに`xaxis`プロパティの存在が記載されているのではないかと推測していました。


CC BY-SA 4.0
2021-06-15T07:55:41.757
77574
2021-06-15T09:39:05.550
2021-06-15T09:37:49.890
9008
9008
question
python matplotlib
axがxaxisを持っていることについてドキュメントに記載がない


その参照している [matplotlib.axes](https://matplotlib.org/stable/api/axes_api.html)
のページに色々と出てきていますが、それらのことでは不足なのでしょうか？

* * *

例えば最初の方の説明(太字化は回答者)

> The Axes contains most of the figure elements: **Axis** , Tick, Line2D,
> Text, Polygon, etc., and sets the coordinate system.

> sharex, sharey : **Axes** , optional  
>  The **x or y axis** is shared with the **x or y axis** in the input Axes.

あるいは下の方の表?にいくつも`axis`が出てきます。

> [Text and annotations](https://matplotlib.org/stable/api/axes_api.html#text-
> and-annotations)

> [Appearance](https://matplotlib.org/stable/api/axes_api.html#appearance)

> [Axis / limits](https://matplotlib.org/stable/api/axes_api.html#axis-limits)

ここの最初に以下があり、AxesからXAxisが取得出来るようです。

> Axes.get_xaxis Return the XAxis instance.

以後の表にもいっぱいaxisが出てきています。

* * *

`X`とか`Y`の付かない`Axis`の説明はこちらのページで、これを継承して`XAxis`があるという図になっています。  
[matplotlib.axis](https://matplotlib.org/stable/api/axis_api.html)

* * *

コメントに対して：

最初に参照している
[早く知っておきたかったmatplotlibの基礎知識、あるいは見た目の調整が捗るArtistの話](https://qiita.com/skotaro/items/08dc0b8c5704c94eafb9)
の記事で、[Figure, Axes,
Axisは階層構造になっている](https://qiita.com/skotaro/items/08dc0b8c5704c94eafb9#figure-
axes-
axis%E3%81%AF%E9%9A%8E%E5%B1%A4%E6%A7%8B%E9%80%A0%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B)
の部分に、そうしたアクセスの例が記述されています。

>
[code]

>     fig = plt.figure()
>     ax = fig.add_subplot(1,1,1) # 何もプロットしていないAxesでもAxisは自動的に作られる
>     print('fig.axes:', fig.axes)
>     print('ax.figure:', ax.figure)
>     print('ax.xaxis:', ax.xaxis)
>     print('ax.yaxis:', ax.yaxis)
>     print('ax.xaxis.axes:', ax.xaxis.axes)
>     print('ax.yaxis.axes:', ax.yaxis.axes)
>     print('ax.xaxis.figure:', ax.xaxis.figure)
>     print('ax.yaxis.figure:', ax.yaxis.figure)
>     print('fig.xaxis:', fig.xaxis)
>  
[/code]

その次の
[グラフに表示されているものは全てArtist](https://qiita.com/skotaro/items/08dc0b8c5704c94eafb9#%E3%82%B0%E3%83%A9%E3%83%95%E3%81%AB%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E3%82%82%E3%81%AE%E3%81%AF%E5%85%A8%E3%81%A6artist)
のところで、データ構造の階層図の直後にこう書かれています。

>
> 前項のサンプルコードの結果を見るとわかりますが、Axisは実際にはXAxisとYAxisという名前です。Axisの下にはさらTickという目盛り関連の線や文字のためのcontainerがあります。containerはその名の通りprimitiveを入れる箱を持っています。このとき、containerの階層構造にあった「一つしか持てない」という制限はなく、いくつでもおなじprimitiveを持つことができます。

そしてmatplotlibの
[Appearance](https://matplotlib.org/stable/api/axes_api.html#appearance)
の表にある以下が、「Axisは実際にはXAxisとYAxisという名前です。」を表しているのかもしれません。  
(同じく太字化は回答者)

> **Axes.axis Convenience method to get or set some axis properties.**

それだと、確かに公式ドキュメントでは端折りすぎていて説明不足な感じですね。  
今のところ明確には書かれていない感じでしょうか。

* * *

ちなみに他にこんな記事があります。  
[matplotlibのめっちゃまとめ](https://qiita.com/nkay/items/d1eb91e33b9d6469ef51)  
[6\.
軸の設定](https://qiita.com/nkay/items/d1eb91e33b9d6469ef51#6-%E8%BB%B8%E3%81%AE%E8%A8%AD%E5%AE%9A)

> グラフの軸は、横軸Axes.xaxisと縦軸Axes.yaxisと、グラフの枠Axes.spinesでできている。

以後の説明で`ax.xaxis.xxxx`というのがいっぱい使われています。


CC BY-SA 4.0
2021-06-15T08:49:15.707
77575
2021-06-15T09:39:05.550
2021-06-15T09:39:05.550
26370
26370
77574
answer