Я строю точечный график, демонстрирующий защиту всех команд НФЛ. Вместо их имен в виде простого текста я хочу показать их изображения на нижней оси. Возможно ли это сделать? Вот фрагмент кода, который я смог придумать:
fig = px.scatter(df, x='defensiveTeam', y='passResult')
fig.show()
Обратите внимание, что мои изображения хранятся локально.
Насколько я мог найти, я не мог найти способ разместить изображение по оси X. Можно разместить изображение в точках разброса с помощью следующего кода, который стирает галочки на оси x, но должен отображать их на вашем графике.
import plotly.express as px
import base64
x=[0, 1, 2, 3, 4]
y=[2, 1, 4, 9, 16]
fig = px.scatter(x=x, y=y)
team_logos = ['arizona_cardinals.png','atlanta_falcons.png','carolina_panthers.png','chicago_bears.png','dallas_cowboys.png']
fig.update_xaxes(tickvals=['','','','',''])
fig.update_layout(yaxis_range=[0,20])
# add images
for i,src,yy in zip(range(len(team_logos)),team_logos,y):
logo = base64.b64encode(open('./data/'+src, 'rb').read())
fig.add_layout_image(
source='data:image/png;base64,{}'.format(logo.decode()),
xref = "x",
yref = "y",
x=i,
y=yy,
xanchor = "center",
yanchor = "bottom",
sizex=3,
sizey=3,
)
fig.show()
Для работы с локальными изображениями вам потребуется преобразовать их в формат base64. Код обновлен.
Можно ли использовать тот же подход для «px.timeline»? Или это работает только для точечных диаграмм?
@Waled Malik Я думаю, что это можно использовать для обоих.
Если кто-то хочет читать изображения с URL-адресов, вы можете заменить строку logo = base64.b64encode(open('./data/'+src, 'rb').read())
на logo = base64.b64encode(requests.get(src).content)
. Просто убедитесь, что import requests
также.
Это не сработает, если я изменил каталог изображений на свои локальные.