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

标签 python plotly plotly-express

我正在使用 Plotly Express 生成 WindRose,并且想知道是否可以偏移径向的起点。

我想要实现的是将 0-2 MPH 风速显示为一个表示平静的圆圈,如图 2 所示。

不确定是否可能或如何做到这一点,任何帮助将不胜感激。

WindRose generated using Plotly Express

Windrose that I would like to get

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,Frequency
N,0-2,1.45
N,2-5,0.4
N,5-7,
N,7-10,
N,10-15,
N,15-20,
NNE,0-2,0.53
NNE,2-5,0.53
NNE,5-7,
NNE,7-10,
NNE,10-15,
NNE,15-20,
NE,0-2,1.06
NE,2-5,
NE,5-7,
NE,7-10,
NE,10-15,
NE,15-20,
ENE,0-2,0.79
ENE,2-5,0.4
ENE,5-7,
ENE,7-10,
ENE,10-15,
ENE,15-20,
E,0-2,1.32
E,2-5,
E,5-7,
E,7-10,
E,10-15,
E,15-20,
ESE,0-2,1.19
ESE,2-5,0.26
ESE,5-7,
ESE,7-10,
ESE,10-15,
ESE,15-20,
SE,0-2,1.72
SE,2-5,1.19
SE,5-7,0.4
SE,7-10,0.13
SE,10-15,
SE,15-20,
SSE,0-2,1.19
SSE,2-5,3.04
SSE,5-7,1.98
SSE,7-10,0.4
SSE,10-15,
SSE,15-20,
S,0-2,1.06
S,2-5,3.17
S,5-7,1.19
S,7-10,
S,10-15,
S,15-20,
SSW,0-2,0.13
SSW,2-5,2.11
SSW,5-7,0.4
SSW,7-10,
SSW,10-15,
SSW,15-20,
SW,0-2,0.79
SW,2-5,0.92
SW,5-7,0.53
SW,7-10,
SW,10-15,
SW,15-20,
WSW,0-2,0.79
WSW,2-5,1.19
WSW,5-7,0.26
WSW,7-10,
WSW,10-15,
WSW,15-20,
W,0-2,0.92
W,2-5,3.83
W,5-7,2.64
W,7-10,0.4
W,10-15,
W,15-20,
WNW,0-2,3.3
WNW,2-5,7.53
WNW,5-7,9.64
WNW,7-10,4.62
WNW,10-15,0.79
WNW,15-20,
NW,0-2,1.72
NW,2-5,10.04
NW,5-7,11.1
NW,7-10,7.4
NW,10-15,1.06
NW,15-20,
NNW,0-2,1.85
NNW,2-5,1.85
NNW,5-7,0.79
NNW,7-10,
NNW,10-15,
NNW,15-20,

最佳答案

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

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

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

enter image description here

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

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

enter image description here

我已包含以下代码:

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()

关于python - 偏移极杆径向原点,python Plotly Express,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63713418/

相关文章:

python - 使用显示的 Plotly Express 小部件保存 Jupyter Notebook

python - 如果已经存在,则返回类实例而不是创建新实例

python - tkinter LabelFrame 没有附加小部件

python - 如何在plotly3.6中对条形图进行排序?

python - 如何在 Dash 中创建按钮以从系列中排除值

python - 为什么空格不是 input() 的分隔符?

python - SQLAlchemy "AttributeError: ' str'对象没有属性 'c'“

python - 当有人单击自定义按钮时,我可以触发什么输入事件?

python - 如何在 Python (plotly.express, px) 中使用 Plotly Express 仅显示图例的一个子集?