使用plotly进行绘图时,有时会想要往图标中加入图片。关于这一点,官方文档中给出了示例,选取其中一个示例的核心代码片段如下:
fig.add_layout_image(
dict(
source="https://images.plot.ly/language-icons/api-home/python-logo.png",
xref="x",
yref="y",
x=0,
y=3,
sizex=2,
sizey=2,
sizing="stretch",
opacity=0.5,
layer="below")
)
source
指定了图片的来源,如果是本地的图片,则需要用类似PIL
的包进行读取(后续会有示例);xref
和yxef
是指的图片的定位方式,如上所定义时,x=0
和y=3
则意味着以横坐标为0
和纵坐标为3
的值为锚点来放置图片。
然而,当我想按照上述思路给一个横坐标轴是日期的图表嵌入图片时,却发现图片怎么也显示不出来:
import plotly.graph_objects as go
# Create figure
fig = go.Figure()
# Add trace
fig.add_trace(
go.Scatter(x=['2022-1-1', '2022-1-2', '2022-1-3'], y=[3.2, 2, 4.5])
)
# Add images
fig.add_layout_image(
dict(
source="https://images.plot.ly/language-icons/api-home/python-logo.png",
xref="x",
yref="y",
x='2022-1-2',
y=2,
sizex=2,
sizey=2,
xanchor='center',
yanchor='middle',
sizing="stretch",
opacity=0.5,
layer="below")
)
# Set templates
fig.update_layout(template="plotly_white")
fig.show()
经过多方寻求帮助,发现问题如下:
当x轴为日期(或明显是用于指代日期的字符串)数据时,嵌入的图片的大小(即sizex
和sizey
的值)是以毫秒为单位的。
也就是说,上述代码对图片大小的设置小了,以至于显示不出来。可以将其调大,如sizex=2*60*60*1000
,sizey=0.3
。
注意:y轴是数值轴,因此sizey
的单位是数值,不是毫秒。
上述2*60*60*1000
毫秒,其实是2个小时,也就是说,如果每个主间隔为1天,那么图片的宽度为主间隔的1/12。
至于为什么是这样,以及讨论过程,可以看这里。