90075


# 環境

  * Python3.10.2
  * bokeh 2.4.3

# やりたいこと

bokehで折れ線グラフを描画しています。  
以下のサイトを参考にして、第2のY軸を設定しました。

<https://docs.bokeh.org/en/latest/docs/user_guide/plotting.html#twin-axes>  
<https://stackoverflow.com/questions/25199665/>

[code]

    from bokeh.models import DataRange1d, LinearAxis
    from bokeh.plotting import figure, output_file, save
    output_file("graph.html")
    
    x = [0, 1, 2]
    y1 = [0, 1, 2]
    y2 = [0, 100, 200]
    
    fig = figure(x_axis_label="x", y_axis_label="y1")
    y_range_name = "secondary_axis"
    fig.extra_y_ranges = {y_range_name: DataRange1d(end=max(y2) * 1.05)}
    
    fig.line(x=x, y=y1, legend_label="y1", color="blue")
    fig.line(
        x=x,
        y=y2,
        legend_label="y2",
        color="red",
        y_range_name=y_range_name,
    )
    
    fig.add_layout(
        LinearAxis(
            y_range_name=y_range_name,
            axis_label="y2",
        ),
        "right",
    )
    
    save(fig)
    
[/code]

[![画像の説明をここに入力](https://i.stack.imgur.com/hSHor.png)](https://i.stack.imgur.com/hSHor.png)

# 質問

上記のコードでは、第1Y軸の範囲は、第2Y軸の範囲と同じでした。第1Y軸の範囲が`0~200`と広いため、折れ線の変化が見づらいです。第1Y軸の範囲を`0~10`などもっと狭くしたいです。

第1Y軸の範囲を明示的に指定することなく、適切な範囲にするにはどうすればよいでしょうか？

また`y1`と`y2`を以下の値に変更すると、下図のように第1Y軸の範囲は適切になりました。なぜ、このケースでは第1Y軸の範囲は適切になるのでしょうか？

[code]

    y1 = [30, 230, 650]
    y2 = [3, 23, 65]
    
[/code]

[![画像の説明をここに入力](https://i.stack.imgur.com/E6SWS.png)](https://i.stack.imgur.com/E6SWS.png)

# 補足

## y1,y2のデータ

y1,y2のデータをいろいろ変えて、試しました。

[code]

    y1 = [0, 1, 2]
    y2 = [0, 1, 100]
    
[/code]

[![画像の説明をここに入力](https://i.stack.imgur.com/5DCaQ.png)](https://i.stack.imgur.com/5DCaQ.png)

y1とy2の値を入れ替えると、第1のY軸の範囲は`y1`の最小値から最大値になりました。

[code]

    y1 = [0, 1, 100]
    y2 = [0, 1, 2]
    
[/code]

[![画像の説明をここに入力](https://i.stack.imgur.com/hjLto.png)](https://i.stack.imgur.com/hjLto.png)

つまり、以下であることが分かりました。

  * 第1Y軸の最大値が第2Y軸の最大値より大きい場合は、第1Y軸の範囲は最適な範囲になる
  * 第1Y軸の最大値が第2Y軸の最大値より小さい場合は、第1Y軸の範囲は第2Y軸の範囲と同じになる


CC BY-SA 4.0
2022-07-12T23:30:16.920
89939
2022-07-19T05:08:30.607
2022-07-18T15:45:05.150
19524
19524
question
python bokeh
bokehで第2のY軸を設定したときに、第1のY軸の範囲が第2のY軸範囲と同じになります。第1Y軸の範囲を明示的に指定することなく、最適な範囲に設定する方法を教えてください。


bokehのフォーラムで教えていただきました。  
<https://discourse.bokeh.org/t/when-adding-secondary-vertical-axes-the-range-
of-primary-axes-is-too-wide/9380/2?u=yuji38kwmt>

> By default, a DataRange1d will auto-range using all available glyph
> renderers, If you want to restrict to only a subset of glyphs, you have to
> tell it which ones you want by setting the renderers 1 property of the
> range. The example demonstrates here this:

`y_range.renderers`に`line()`の戻り値を設定することで、解決しました。

[code]

    from bokeh.models import DataRange1d, LinearAxis
    from bokeh.plotting import figure, output_file, save
    
    output_file("graph.html")
    
    x = [0, 1, 2]
    y1 = [0, 1, 2]
    y2 = [0, 1, 100]
    
    fig = figure(x_axis_label="x", y_axis_label="y1")
    
    y_range_name = "secondary_axis"
    
    y1_line = fig.line(x=x, y=y1, legend_label="y1", color="blue")
    y2_line = fig.line(
        x=x,
        y=y2,
        legend_label="y2",
        color="red",
        y_range_name=y_range_name,
    )
    
    fig.extra_y_ranges = {y_range_name: DataRange1d(renderers=[y2_line])}
    
    fig.y_range.renderers = [y1_line]
    fig.add_layout(
        LinearAxis(
            y_range_name=y_range_name,
            axis_label="y2",
        ),
        "right",
    )
    
    save(fig)
    
[/code]

[![画像の説明をここに入力](https://i.stack.imgur.com/4KaCZ.png)](https://i.stack.imgur.com/4KaCZ.png)


CC BY-SA 4.0
2022-07-19T05:08:30.607
90075
2022-07-19T05:08:30.607
19524
89939
answer