python - 自动放置注释气泡

标签 python python-3.x pandas matplotlib annotations

我有以下代码片段:

data.plot(y='Close', ax = ax)
newdates = exceptthursday.loc[start:end]
for anotate in (newdates.index + BDay()).strftime('%Y-%m-%d'):
    ax.annotate('holliday', xy=(anotate, data['Close'].loc[anotate]),  xycoords='data',
                xytext=(-30, 40), textcoords='offset points',
                size=13, ha='center', va="baseline",
                bbox=dict(boxstyle="round", alpha=0.1),
                arrowprops=dict(arrowstyle="wedge,tail_width=0.5", alpha=0.1)); 
这会产生一个如下所示的图:
enter image description here
正如你所看到的,我已经明确提到了 xytext ,这会使“气泡”变得凌乱,因为它们在某些位置重叠,从而难以阅读。有什么办法可以“自动放置”,使它们不重叠。例如一些“气泡”以不重叠的方式位于情节线的上方和下方。

最佳答案

根据我的说法,自动放置是这样您放大缩小并自动调整数据和用户界面,因为即使您将气泡放置在绘图线上方和下方,也无法避免重叠,因为许多数据点无法被忽略。我用过 plotly库作为 matplotlib 有局限性。我选择了英国假期。您可以相应地更改它。

import plotly.graph_objects as go
import plotly.express as px
from pandas_datareader import data as web
import holidays

data = web.DataReader('fb', 'yahoo')
uk_holidays = holidays.UnitedKingdom()
data["is_holiday"] = [True if i in uk_holidays else False for i in data.index]
data["Date"] = data.index
data.reset_index(drop=True, inplace=True)

fig = px.line(data, x='Date', y='Close')

fig.update_xaxes(
    rangeslider_visible=True,
    rangeselector=dict(
        buttons=list([
            dict(count=1, label="1m", step="month", stepmode="backward"),
            dict(count=6, label="6m", step="month", stepmode="backward"),
            dict(count=1, label="YTD", step="year", stepmode="todate"),
            dict(count=1, label="1y", step="year", stepmode="backward"),
            dict(step="all")
        ])
    )
)


for close, date in data[data["is_holiday"] == True][["Close","Date"]].itertuples(index=False):
    fig.add_annotation(
        x=date.date(),
        y=close,
        xref="x",
        yref="y",
        text="Holiday",
        showarrow=True,
        font=dict(
            family="Courier New, monospace",
            size=16,
            color="#ffffff"
            ),
        align="center",
        arrowhead=2,
        arrowsize=1,
        arrowwidth=2,
        arrowcolor="#636363",
        ax=20,
        ay=-30,
        bordercolor="#c7c7c7",
        borderwidth=2,
        borderpad=4,
        bgcolor="#ff7f0e",
        opacity=0.8
        )
fig.update_layout(title_text='Trend Analysis with Holiday', title_x=0.5,showlegend=False)
fig.show()
上述代码的工作:
enter image description here

关于python - 自动放置注释气泡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62734557/

相关文章:

python - 使用装饰器进行数据驱动测试

python - 使用OpenCV和Python从图像创建视频

python - 通过将方法名称保存在 python 的 for 循环中的 var 中来连接到类方法

Python3 无穷大/NaN : Decimal vs. float

python - 使用关键字查找项目

python - Pandas 数据框到 namespace 为 None 的嵌套字典

Python 请求流异步

python - 熔化和删除重复数据帧的反转

python - 索引 KFold split 方法返回的 DataFrame 是 iloc 还是 loc?

python - 如何向 pandas.TimeGrouper 添加填充