【问题标题】:Can we plot non-linear data points over a diagonal line in plotly?我们可以在对角线上绘制非线性数据点吗?
【发布时间】:2021-10-06 05:07:43
【问题描述】:

我需要在一条直线上绘制一列,而不管它们的值如何。 例如,如果我有以下数据:

ID colA colB
1 50 70
2 30 -20
3 60 60
4 20 20
5 10 -40
6 50 -10
7 10 65

我想要两条曲线,

曲线 1:45 度的直线,直线上有 50、30、60、20、10、50、10 点,分别对应 x 轴上的 ID。

曲线 2:来自 ColB 的散点图显示与各个 colA 条目的偏差。点将被放置在直线上的点的下方或上方。

目标是显示 ColB 与 ColA 的偏差,以便我不断改进 ColB 的数字,直到偏差为 0,并且两列都在同一条直线上。

【问题讨论】:

  • plotly时为什么要加上gnuplot这个标签?你想要一个 gnuplot 解决方案吗?
  • 您希望 x 值按数字顺序还是按 ID 顺序排列?
  • @DerekO 想要按 ID 顺序排列的 x 值
  • @theozh 想要解决方案,但如果我可以在 gnuplot 中获得解决方案,那也很好,因为我可以自己制作它的情节版本。
  • @user1660982 如果您强制 x=50 占据 xaxis 上的第一个刻度线 (ID=1),并且 x=30 占据 xaxis 上的第二个刻度线 (ID=2) 那么yaxis 需要 y=50 作为 yaxis 的第一个刻度,y=30 作为 yaxis 的第二个刻度。但是如果 yaxis 像 xaxis 一样是分类的,那么显示偏差没有意义(如何在两个轴都是分类的图表上绘制 x=50 和 y=70?)。如果你让两个轴都按照 ID 的顺序分类,那么偏离直线将没有任何意义

标签: python-3.x plot plotly gnuplot scatter-plot


【解决方案1】:

这是一个使用 gnuplot 的答案。

它绘制代表“colA”数据的黑点和代表“colA+colB”的红点。此外,连接上述两点的垂直线使用“带矢量”样式绘制为灰色。

为了使直线为45度,它与垂直轴和水平轴的比例尺匹配如下。

set size ratio -1

完整的脚本在这里。

$DATA << EOD
# ID    colA    colB
1   50  70
2   30  -20
3   60  60
4   20  20
5   10  -40
6   50  -10
7   10  65
EOD

set size ratio -1
set xrange [-40:140]
set yrange [-40:140]
set grid xtics ytics
unset key 

plot x with line lc rgb 'black', \
     $DATA using 2:2:(0):3 with vectors lc rgb 'gray' nohead, \
     $DATA using 2:2 with points pt 7 lc rgb 'black', \
     $DATA using 2:($2+$3) with points pt 7 lc rgb 'red'

【讨论】:

    【解决方案2】:

    我不确定这是否正是您想要的,但您可以通过将 x 和 y 值设置为 colA 中的值来绘制一条直线,然后绘制 colA 与 colB 的值:

    import pandas as pd
    import plotly.graph_objects as go 
    
    df = pd.DataFrame({
        'ID':list(range(1,8)),
        'colA':[50,30,60,20,10,50,10],
        'colB':[70,-20,60,20,-40,-10,65]
    })
    
    ## make xaxis categorical
    fig = go.Figure()
    fig.add_trace(go.Scatter(
        x=df['colA'],
        y=df['colA'],
        mode='lines'
    ))
    
    fig.add_trace(go.Scatter(
        x=df['colA'],
        y=df['colB'],
        mode='markers'
    ))
    
    x_min, x_max = min(df['colA']), max(df['colA'])
    fig.update_xaxes(categoryorder='array', categoryarray= df['colA'].values, range=[x_min-0.1, x_max+0.1])
    fig.update_layout(showlegend=False)
    fig.show()
    

    【讨论】:

    • 嗨@Derek, fig.update_xaxes() 行是做什么的?
    • 我试图将 xaxis 设置为分类数组,但我意识到它没有做任何事情,因为所有值的顺序都与线性 xaxis 相同。跨度>
    猜你喜欢
    • 1970-01-01
    • 2014-09-05
    • 2014-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-02
    • 2013-08-06
    • 2013-03-13
    相关资源
    最近更新 更多