我的阴谋子图的第一个图占据整个图(2x4轴网格)

时间:2016-04-26 15:06:23

标签: python dimensions plotly subplot

我正在努力解决某些事情,即使我确定这是一个我忽略的小事,我找不到合理的解释。

在尝试绘制2x4子图时,8个图中的第一个绘制在整个8个网格上,而不是位于子图的位置(1,1)。剩下的7个图表按预期绘制,第一个图表在它们之下部分可见。这是我正在使用的代码:

#make a new trace (plot) for every sample:
def make_trace(x_list, y_list, samplename):
    trace = go.Scatter(
        x = x_list,
        y = y_list,
        name=samplename
     )

    layout = go.Layout(
        title=samplename,   
        showlegend=True
        )
    )

    return trace, layout

#call the make_trace function for every sample and append to the figure
def make_subplot():

    fig = tls.make_subplots(rows=2, cols=4,plot_titles=cols_list)
    row_num = [1,1,1,1,2,2,2,2,3,3,3,3]
    column_num = [1,2,3,4,1,2,3,4,1,2,3,4]
    i = 0

    for sample in cols_list[1:]:
        trace, layout = make_trace(normalised_df['percentage'],                                                     
                                   normalised_df[sample], sample)            
        fig.append_trace(trace, row_num[i], column_num[i])
        i += 1

    fig['layout'].update(title='Normalized Mean Coverage', height=600,   
                        width=800,showlegend=False,font=dict(size=14),     
                        xaxis=dict(title="Transcript Length (%)"),                          
                        yaxis=dict(title="Normalised Mean Coverage"))
    iplot(fig)

#call the function to create the entire figure:
make_subplot()

输出如下: coverage plot

**最后一句话:解决方案似乎在于设置xaxis / yaxis标题...当我在函数调用中的'layout'中更改它们而不是之后调用fig.update()时,子图按预期工作但它的方式太小了。问题是我想将make_trace()保留为一个单独的函数,我稍后将其称为组合图,因此我无法在此函数中更改其x / yaxis标题。

3 个答案:

答案 0 :(得分:0)

这似乎是情节库中的一个错误。在我的情况下已经解决了通过将情节包更新为3.6.0 for R.在Python中我不知道这是否也是一个错误。但如果是这样,只需在github上做一个错误报告。

祝你好运 思南

答案 1 :(得分:0)

您需要分别为每个子图设置xaxis和yaxis标题:

for idx, sample in enumerate(cols_list):
    trace, layout = make_trace(normalised_df['percentage'],                               
                               normalised_df[sample], sample) 
    fig.append_trace(trace, row_num[i], column_num[i])
    fig['layout']['xaxis{}'.format(idx+1)].update(title='Transcript Length (%)')
    fig['layout']['yaxis{}'.format(idx+1)].update(title='Normalised Mean Coverage')

答案 2 :(得分:0)

您是否尝试过为每个子图设置轴和轴锚点?像这样:

t1 = go.Scatter(x=x, y=y1(x), xaxis="x1", yaxis="y1", name="Trace 1")
t2 = go.Scatter(x=x, y=y2(x), xaxis="x2", yaxis="y2", name="Trace 2")

layout = go.Layout(
    xaxis1=dict(anchor="y1", domain=[0, 1]),
    yaxis1=dict(anchor="x1", domain=[0.25, 0.45]),

    xaxis2=dict(anchor="y2", domain=[0.5, 1]),
    yaxis2=dict(anchor="x2", domain=[0.8, 1]))