【问题标题】:Plotly, same scale for x and y axis绘图,x 和 y 轴的比例相同
【发布时间】:2015-09-11 01:59:02
【问题描述】:

我正在为 python 使用 plotly,我无法设置 xy 轴,因此它们可以具有相同的比例:

这是我的布局:

layout = Layout(
    xaxis=XAxis(
        range=[-150, 150],
        showgrid=True,
        zeroline=True,
        showline=True,
        gridcolor='#bdbdbd',
        gridwidth=2,
        zerolinecolor='#969696',
        zerolinewidth=4,
        linecolor='#636363',
        linewidth=6
    ),
    yaxis=YAxis(
        range=[-150,150],
        showgrid=True,
        zeroline=True,
        showline=True,
        gridcolor='#bdbdbd',
        gridwidth=2,
        zerolinecolor='#969696',
        zerolinewidth=4,
        linecolor='#636363',
        linewidth=6
    )
)

然后我得到这样的东西!

为什么 x 和 y 的比例不同?这会影响我的可视化。

如何获得带有方形单元格的网格?

【问题讨论】:

    标签: python plotly


    【解决方案1】:

    您可以在布局中为 heightwidth 分配相同的长度。这是一个例子:

    layout = Layout(
        xaxis=XAxis(
           range=[-150, 150],
           showgrid=True,
           zeroline=True,
           showline=True,
           gridcolor='#bdbdbd',
           gridwidth=2,
           zerolinecolor='#969696',
           zerolinewidth=4,
           linecolor='#636363',
           linewidth=6
        ),
        yaxis=YAxis(
            range=[-150,150],
            showgrid=True,
            zeroline=True,
            showline=True,
            gridcolor='#bdbdbd',
            gridwidth=2,
            zerolinecolor='#969696',
            zerolinewidth=4,
            linecolor='#636363',
            linewidth=6
       ),
       height=600,
       width=600,
    )
    

    【讨论】:

    • 请注意,如果有图例,这将不起作用,因为图例也占用了这 600 像素中的一部分。 @Brut 的回答更可靠。
    【解决方案2】:

    @neda 的答案仅适用于 x 和 y 上的相等范围 - 这种情况很少见。这似乎是很多人都在要求的东西,比如 matplotlib 的轴('equal')。见https://github.com/plotly/plotly.py/issues/70

    现在,我分别对两个范围使用乘数 - 基本上定义了每个单位长度在每个轴上的长度。

    height=(yMax - yMin) * mul
    width= (xMax - xMin) * mul
    

    即使这样做,网格也不是 %100 完美的正方形..

    【讨论】:

      【解决方案3】:

      终于实现了这个功能。

      layout = go.Layout(yaxis=dict(scaleanchor="x", scaleratio=1))
      

      更新:在新版本的 plotly 中,使用以下内容:

      fig.update_yaxes(
          scaleanchor = "x",
          scaleratio = 1,
        )
      

      在此处查看示例https://plot.ly/python/axes/#fixed-ratio-axes

      【讨论】:

      • 有没有办法为 3D 绘图做到这一点?我试过go.Layout(zaxis=dict(scaleanchor="x", scaleratio=1)),但没用。
      • @Ray 看到这个:community.plot.ly/t/…,这个:plot.ly/python/3d-axes
      • 但是,这也限制了缩放交互工具只能是方形的。
      • 好像更新了:fig.update_yaxes(scaleanchor = "x", scaleratio = 1)
      【解决方案4】:
      ml_mx = max(Curve)
      ml_mn = min(Curve)
      ap_mx = max(Curve2)
      ap_mn = min(Curve2)
      
      if ml_mx > ap_mx:
          mx = ml_mx
      else:
          mx = ap_mx
      
      if ml_mn < ap_mn:
          mn = ml_mn
      else:
          mn = ap_mn
      
      mx = mx + mx * 0.2
      mn = mn - mn * 0.2
      
      fig_graficas.update_yaxes(
          range = [mn,mx]
      )
      fig_graficas.update_xaxes(
          range = [mn,mx]
      )
      

      【讨论】:

      • 虽然这段代码可以回答这个问题,但最好在不介绍其他代码的情况下解释它是如何解决问题的,以及为什么要使用它。从长远来看,纯代码的答案没有用处。
      猜你喜欢
      • 2021-11-26
      • 2015-11-26
      • 1970-01-01
      • 2012-06-08
      • 1970-01-01
      • 2019-06-02
      • 1970-01-01
      • 2021-05-30
      • 1970-01-01
      相关资源
      最近更新 更多