为了账号安全,请及时绑定邮箱和手机立即绑定

偏移极杆径向原点,python Plotly Express

偏移极杆径向原点,python Plotly Express

largeQ 2023-07-11 16:33:33
我正在使用 Plotly Express 生成 WindRose,并且想知道是否可以偏移径向的起点。我想要实现的是将 0-2 MPH 风速显示为一个表示平静的圆圈。不确定是否可能或如何做到这一点,任何帮助将不胜感激。fig = px.bar_polar(df, r= "Frequency", theta="Direction",                   color="Strength", template="none",                   labels={"Strength": "Wind Speed in MPH"}                   )fig.update_layout(legend=dict(    orientation="h",    yanchor="top",    y=-0.1,    xanchor="center",    x=0.5),    polar=dict(radialaxis=dict(showticklabels=False, ticks='', linewidth=0)    ))fig.show()Direction,Strength,FrequencyN,0-2,1.45N,2-5,0.4N,5-7,N,7-10,N,10-15,N,15-20,NNE,0-2,0.53NNE,2-5,0.53NNE,5-7,NNE,7-10,NNE,10-15,NNE,15-20,NE,0-2,1.06NE,2-5,NE,5-7,NE,7-10,NE,10-15,NE,15-20,ENE,0-2,0.79ENE,2-5,0.4ENE,5-7,ENE,7-10,ENE,10-15,ENE,15-20,E,0-2,1.32E,2-5,E,5-7,E,7-10,E,10-15,E,15-20,ESE,0-2,1.19ESE,2-5,0.26ESE,5-7,ESE,7-10,ESE,10-15,ESE,15-20,SE,0-2,1.72SE,2-5,1.19SE,5-7,0.4SE,7-10,0.13SE,10-15,SE,15-20,SSE,0-2,1.19SSE,2-5,3.04SSE,5-7,1.98SSE,7-10,0.4SSE,10-15,SSE,15-20,S,0-2,1.06S,2-5,3.17S,5-7,1.19S,7-10,S,10-15,S,15-20,SSW,0-2,0.13SSW,2-5,2.11SSW,5-7,0.4SSW,7-10,SSW,10-15,SSW,15-20,SW,0-2,0.79SW,2-5,0.92SW,5-7,0.53SW,7-10,SW,10-15,SW,15-20,WSW,0-2,0.79WSW,2-5,1.19WSW,5-7,0.26WSW,7-10,WSW,10-15,WSW,15-20,W,0-2,0.92W,2-5,3.83W,5-7,2.64W,7-10,0.4W,10-15,W,15-20,WNW,0-2,3.3WNW,2-5,7.53WNW,5-7,9.64WNW,7-10,4.62WNW,10-15,0.79WNW,15-20,NW,0-2,1.72NW,2-5,10.04NW,5-7,11.1NW,7-10,7.4NW,10-15,1.06NW,15-20,NNW,0-2,1.85NNW,2-5,1.85NNW,5-7,0.79NNW,7-10,NNW,10-15,NNW,15-20,
查看完整描述

2 回答

?
繁花如伊

TA贡献2012条经验 获得超12个赞

由于似乎没有办法调整bar_polarPlotly 中绘图的起始半径值,因此最好的选择是尝试找到一些解决方法。

诚然,这是一个非常老套的解决方案,但为了确保图表不太接近原点,我们可以创建一个New_Frequency列,只需向该Frequency列添加任意值即可。我选择了 30。请注意,这样做会扭曲条形之间的相对距离(如果这是一个问题,则需要以某种方式修改解决方案)。

然后我们将 bar_polar 方法中的参数设置r为这个新列,并修改悬停数据,使其显示原始的频率列。

//img1.sycdn.imooc.com//64ad143100017eec06470655.jpg

现在我们可以画一个带有文本“Calm”的圆圈,该圆圈覆盖与 值对应的内部条形0-2 MPH。添加形状时,您需要指定笛卡尔坐标,尽管这是极坐标图。经过一番尝试和错误后,似乎 x=0.5、y=0.5 是 bar_极坐标图的中心,并且从 x0=0.4、y0=0.4、x1=0.6、y1=0.6 出发的圆覆盖了内部条形。我不知道是否有这方面的文档。

如果您只是追求图像,那么希望它看起来不错。请注意,在图例中切换不同的风速会扭曲绘图,并且圆圈将不再覆盖内部条形,因此您会失去绘图的一些交互性。

//img1.sycdn.imooc.com//64ad143d00013a9d06490680.jpg

我已包含以下代码:


import pandas as pd

import plotly.express as px

import plotly.graph_objects as go


df = pd.read_csv("windrose.csv")


## this adds 30 to all frequencies, so 0-2 becomes 30-32

df["New_Frequency"] = df["Frequency"] + 30


fig = px.bar_polar(df, r="New_Frequency", theta="Direction",

                   color="Strength", template="none",

                   labels={"Strength": "Wind Speed in MPH"},

                   hover_data={"Strength":True, "New_Frequency":False, "Frequency":True ,"Direction":True}

                   )


fig.add_shape(

    type="circle",

            xref="paper",

            yref="paper",

            x0=0.4,

            y0=0.4,

            x1=0.6,

            y1=0.6,

            line_color="Black",

            fillcolor="White",

            # text="Calm"

)


fig.add_annotation( # add a text callout with arrow

    text="Calm", x=0.5, y=0.5, showarrow=False

)


fig.update_layout(width=800, height=800)

fig.update_layout(legend=dict(

    orientation="h",

    yanchor="top",

    y=-0.1,

    xanchor="center",

    x=0.5),

    polar=dict(radialaxis=dict(showticklabels=False, ticks='', linewidth=0)

    )

)

fig.show()



查看完整回答
反对 回复 2023-07-11
?
守候你守候我

TA贡献1802条经验 获得超10个赞

我找到了另一种解决方案,通过在 update_layout 中使用“hole”在极坐标条形图的中间添加一个圆圈。代码附在下面:


fig2 = px.bar_polar(df, r="Frequency", theta="Direction",

                    color="Strength", template="none",

                    labels={"Strength": "Wind Speed <br>&nbsp;&nbsp;&nbsp; in MPH:"

                            }

                    )


fig2.add_annotation(

    text="Calm<br>" + " " + percent + "%", x=0.5, y=0.5, showarrow=False

)


fig2.add_annotation(

    text="Calm Values are for <br> Wind Speed <2.0 MPH <br />", x=0.93, y=-0.13, showarrow=False

)


fig2.update_layout(legend=dict(

    orientation="h",

    yanchor="middle",  

    y=-0.1,

    xanchor="center",

    x=0.5,

    font=dict(

        size=14)),

    polar=dict(hole=0.1, radialaxis=dict(showticklabels=False, ticks='', linewidth=0)

               ),

    margin=dict(t=110),

    title=dict(

        text=title,

        xanchor='center',

        yanchor='top'

    )

)

输出:

//img1.sycdn.imooc.com//64ad14650001e64114671249.jpg

由于 0-2 MPH 在中间显示为圆圈,因此在我的数据框中,我将所有 0-2 MPH 的值设置为零,这确保不显示 0-2 bin。



查看完整回答
反对 回复 2023-07-11
  • 2 回答
  • 0 关注
  • 127 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信