Plotly Multi Column Horizo​​ntal Legend

时间:2017-05-02 20:16:03

标签: r r-markdown plotly

我正在尝试使用plotly包在R中创建水平条形图。由于图例项目的长度,我希望它们在2列中在视觉的顶部或底部水平显示。是否可以规定图例的列数?

我已经能够使用Layout(legend = list(orientation='h'))成功地将图例放在x轴下方,但无论我在哪里放置图例(使用x和y参数),它总是只有一个长列表。我见过一个用于在js中创建多列图例的github项目,但不是r。

谢谢,

2 个答案:

答案 0 :(得分:0)

这是不可能的正常方式。我认为它有自己的逻辑,决定了它有多少位置以及它将显示多少列。

所以我想如果你让你的绘图宽度更小,你可以达到它只显示2列的目标。

此外,您可以尝试通过将rl设置为10来尝试使用边距属性(https://plot.ly/r/reference/#layout-margin),例如

另一个想法可能是使图例(https://plot.ly/r/reference/#layout-legend-font-size)中的字体大小更大,以便它只使用两列。希望它有所帮助。

答案 1 :(得分:0)

我读了同一个github页面,我认为这是不可能的,但似乎是!我只检查了 Python,但我希望这对你在 R 中的努力以及在 Python 中寻找信息的每个人都有帮助。遗憾的是,与其他软件包相比,这里关于 Plotly 的信息并不多。

这解决了我的问题

设置 orientation='h' 是不够的。如果您希望它们位于不同的列中,您还必须将图例项放在不同的 legendgroup 中。这是带有图例标签的示例:

fig = go.Figure([
go.Scatter(x=best_neurons_df['Test Size'],
    y=best_neurons_df['Training Accuracy Max'],
# You can write anything as the group name, as long as it's different.
    legendgroup="group2", 
    name='Training',
    mode='markers',
go.Scatter(x=best_neurons_df['Test Size'],
    y=best_neurons_df['Validation Accuracy Max'],
# You can write anything as the group name, as long as it's different.
    legendgroup="group1",
layout=dict(title='Best Model Dependency on Validation Split',
    xaxis=dict(title='Validation Set proportion'),
    yaxis=dict(title='Accuracy'),
    margin=dict(b=100, t=100, l=0, r=0),
    legend=dict(x=1, y=1.01,xanchor='right', yanchor='bottom',
        title='', 
        orientation='h', # Remember this as well.
        bordercolor='black',
        borderwidth=1
))

Example image Example image