90087


以下を実行し、

[code]

    import numpy as np
    import matplotlib.pyplot as plt
    from scipy import stats, integrate
    from scipy.optimize import minimize_scalar
    %precision 3
    %matplotlib inline
    
[/code]

[code]

    x_range=[0,2]
    y_range=[0,1]
    
    def f_xy(x,y):
        if 0<=y<=1 and 0<=x-y<=1:
            return 4*y*(x-y)
        else:
            return 0
        
    XY=[x_range,y_range,f_xy]
    
[/code]

[code]

    from functools import partial
    # 周辺密度関数を定義
    def f_X(x):
        return integrate.quad(partial(f_xy, x), -np.inf, np.inf)[0]
    X = [x_range, f_X]
    def f_Y(y):
        return integrate.quad(partial(f_xy, y), -np.inf, np.inf)[0]
    Y = [y_range, f_Y]
    
[/code]

[code]

    xs=np.linspace(*x_range,100)
    ys=np.linspace(*y_range,100)
    
    fig=plt.figure(figsize=(12,4))
    ax1=fig.add_subplot(121)
    ax2=fig.add_subplot(122)
    ax1.plot(xs,[f_X(x)for x in xs],color='gray')
    ax2.plot(ys,[f_Y(y)for y in ys],color='gray')
    ax1.set_title('Xの周辺密度関数',fontname='MS Gothic')
    ax2.set_title('Yの周辺密度関数',fontname='MS Gothic')
    
    plt.show()
    
[/code]

[![画像の説明をここに入力](https://i.stack.imgur.com/YqUS1.png)](https://i.stack.imgur.com/YqUS1.png)  
上図を出力したいです。

私は何回やっても、下図のように右側のグラフが曲線になってしまいます。  
エラーメッセージは出ていません。  
[![画像の説明をここに入力](https://i.stack.imgur.com/mwsxE.png)](https://i.stack.imgur.com/mwsxE.png)


CC BY-SA 4.0
2022-07-18T11:24:49.440
90063
2022-07-19T13:15:01.653
2022-07-19T05:38:29.510
52631
52631
question
python python3 jupyter-notebook
python jupyter notebook 周辺密度関数を図示する


`def f_X(x):`と`def f_Y(y):`の両方で結局は`integrate.quad(partial(f_xy, x), -np.inf,
np.inf)[0]`という同じ値になる関数を使っているので、結果は指定するパラメータの値に応じて(0.0から1.0までの範囲では)同じ形になると考えられます。  
別の形にしたいなら、別の関数や計算式を設定して使う必要があるのでは？

周辺密度関数とか関係無しに非常に単純に図だけ描ければ良いのなら、2つ目の図の y は x の2倍なので、こちらの行を：

[code]

    ax2.plot(ys,[f_Y(y)for y in ys],color='gray')
    
[/code]

こちらに変更すれば直線の図を描くことが出来ます。

[code]

    ax2.plot(ys,[y*2 for y in ys],color='gray')
    
[/code]

併せて図の中にグリッドを表示するのと質問の問題には関係ない部分をコメントアウトするとこんな風になるでしょう。

[code]

    import numpy as np
    import matplotlib.pyplot as plt
    from scipy import stats, integrate
    from scipy.optimize import minimize_scalar
    %precision 3
    %matplotlib inline
    
    x_range=[0,2]
    y_range=[0,1]
    
    def f_xy(x,y):
        if 0<=y<=1 and 0<=x-y<=1:
            return 4*y*(x-y)
        else:
            return 0
    
    #### XY=[x_range,y_range,f_xy]
    
    from functools import partial
    # 周辺密度関数を定義
    def f_X(x):
        return integrate.quad(partial(f_xy, x), -np.inf, np.inf)[0]
    #### X = [x_range, f_X]
    #### def f_Y(y):
    ####     return integrate.quad(partial(f_xy, y), -np.inf, np.inf)[0]
    #### Y = [y_range, f_Y]
    
    xs=np.linspace(*x_range,100)
    ys=np.linspace(*y_range,100)
    
    fig=plt.figure(figsize=(12,4))
    ax1=fig.add_subplot(121)
    ax2=fig.add_subplot(122)
    ax1.plot(xs,[f_X(x)for x in xs],color='gray')
    ax2.plot(ys,[y*2 for y in ys],color='gray') #### 2つ目の図 y は x の2倍
    ax1.set_title('Xの周辺密度関数',fontname='MS Gothic')
    ax2.set_title('Yの周辺密度関数',fontname='MS Gothic')
    ax1.grid() #### グリッド表示
    ax2.grid() #### 同じく
    
    plt.show()
    
[/code]

正しく2つ目の図用の周辺密度関数を定義したいなら、`def f_Y(y):`関連の記述を復活させて、その内容を相応しいものに修正すれば良いでしょう。


CC BY-SA 4.0
2022-07-19T13:00:03.553
90087
2022-07-19T13:15:01.653
2022-07-19T13:15:01.653
26370
26370
90063
answer