2 回答
TA贡献2012条经验 获得超12个赞
由于似乎没有办法调整bar_polar
Plotly 中绘图的起始半径值,因此最好的选择是尝试找到一些解决方法。
诚然,这是一个非常老套的解决方案,但为了确保图表不太接近原点,我们可以创建一个New_Frequency
列,只需向该Frequency
列添加任意值即可。我选择了 30。请注意,这样做会扭曲条形之间的相对距离(如果这是一个问题,则需要以某种方式修改解决方案)。
然后我们将 bar_polar 方法中的参数设置r
为这个新列,并修改悬停数据,使其显示原始的频率列。
现在我们可以画一个带有文本“Calm”的圆圈,该圆圈覆盖与 值对应的内部条形0-2 MPH
。添加形状时,您需要指定笛卡尔坐标,尽管这是极坐标图。经过一番尝试和错误后,似乎 x=0.5、y=0.5 是 bar_极坐标图的中心,并且从 x0=0.4、y0=0.4、x1=0.6、y1=0.6 出发的圆覆盖了内部条形。我不知道是否有这方面的文档。
如果您只是追求图像,那么希望它看起来不错。请注意,在图例中切换不同的风速会扭曲绘图,并且圆圈将不再覆盖内部条形,因此您会失去绘图的一些交互性。
我已包含以下代码:
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()
TA贡献1802条经验 获得超10个赞
我找到了另一种解决方案,通过在 update_layout 中使用“hole”在极坐标条形图的中间添加一个圆圈。代码附在下面:
fig2 = px.bar_polar(df, r="Frequency", theta="Direction",
color="Strength", template="none",
labels={"Strength": "Wind Speed <br> 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'
)
)
输出:
由于 0-2 MPH 在中间显示为圆圈,因此在我的数据框中,我将所有 0-2 MPH 的值设置为零,这确保不显示 0-2 bin。
添加回答
举报