使用绘图在一张图中绘制多条3d线

时间:2020-02-10 15:19:10

标签: python pandas matplotlib plot plotly

我有许多长度可变的2d序列,即每个子列表都是序列的列表列表。我想在3D可视化中投影这些序列/线/子列表,以增加时间步长作为另一个维度。到目前为止,我无法使用plotly.express绘制所有3d线。

import plotly.express as px

t = [[ii+1 for ii in range(len(features[i]))] for i in range(len(labels))]
x0 = [[x[0] for x in features[i]] for i in range(len(labels))]
x1 = [[x[1] for x in features[i]] for i in range(len(labels))]

df = pd.DataFrame(dict(
    X=[tii for ti in t for tii in ti],
    Y=[xii for xi in x0 for xii in xi],
    Z=[xii for xi in x1 for xii in xi],
    color=[aa for a in labels for aa in a]
))
fig = px.line_3d(df, x="X", y="Y", z="Z", color="color")
fig.show

这就是我得到的,而这并不是我真正想要的。它会将具有共同标签的所有案例/子列表视为一个序列,因此,我们在每一行的末尾看到它返回的起点。我已经研究了如何在for循环中迭代绘制此图形(就像matplotlib一样)(基本上在每次迭代时创建一个新的pandas数据框并对其进行绘制),但是没有成功。请问有人对此有经验吗?非常感谢!

screenshot

mcve如下:

import plotly.express as px
import numpy as np
import pandas as pd

features = [np.random.rand(4,2).tolist(), 
            np.random.rand(5,2).tolist(), 
            np.random.rand(6,2).tolist(), 
            np.random.rand(5,2).tolist(), 
            np.random.rand(9,2).tolist()]
labels = [[1, 1, 1, 1], [1, 1, 1, 1, 1], [2, 2, 2, 2, 2, 2],
         [2, 2, 2, 2, 2], [0, 0, 0, 0, 0, 0, 0, 0, 0]]

t = [[ii+1 for ii in range(len(features[i]))] for i in range(len(labels))]
x0 = [[x[0] for x in features[i]] for i in range(len(labels))]
x1 = [[x[1] for x in features[i]] for i in range(len(labels))]

df2 = pd.DataFrame(dict(
    X=[tii for ti in t for tii in ti],
    Y=[xii for xi in x0 for xii in xi],
    Z=[xii for xi in x1 for xii in xi],
    color=[aa for a in labels for aa in a]
))
fig1 = px.line_3d(df2, x="X", y="Y", z="Z", color="color")
fig1.show()

您基本上看到3行而不是5行。

1 个答案:

答案 0 :(得分:4)

您的问题是您将同一标签用于不同的迹线。这是一个带有循环的解决方法

#include<stdio.h>

struct linklist {

    int data;
    struct linklist* link;

};

void createlinklist (struct linklist* newlist, int data){

    newlist->data = data;
    newlist->link = NULL;

}

void addlinkfirst (struct linklist* list, int data){

    while(list->link != NULL)
        list = list->link;

    struct linklist *newlist = malloc(sizeof(struct linklist));
    newlist->link = NULL;
    list->link = &newlist;
    newlist->data = data;

}

void removelinklast (struct linklist* list){

    struct linklist* temp;

    while(list != NULL){

        temp = &list;
        list = list-> link;
    }

    temp->data = NULL;
    temp->link = NULL;

}

void displaylinklist (struct linklist* list) {
    printf("\n");

    while(list != NULL){
        printf(" %d-",list->data);
        list = list->link;
    }

    printf("\n");
}

int main () {
    int x = 1, data, x1;
    struct linklist test;

    while(x!=0){
        printf("Press 4 to create, Press 1 insert, Press 2 delete, Press 3 Display, Press 0 to Exit \n");
        scanf("%d",&x);
    //i assume you will be choosing 4 first then the other options 
        switch(x){
            case 4: printf("\nEnter data for the first element:"); scanf("%d",&data); createlinklist(&test,data); break;
            case 1: printf("\nEnter data:"); scanf("%d",&x1); addlinkfirst(&test,x1); break;
            case 2: printf("\nDeleted"); removelinklast(&test); break;
            case 3: displaylinklist(&test); break;
            case 0: break;
            default: printf("Invalid Input Try again\n");
        }
    }

    printf("\nThank you for using my linklist program;");
    return 0;
}

您可能需要使用跟踪名称。

更新

希望它并不太复杂,但是它应该尽可能通用

import numpy as np
import plotly.graph_objs as go

features = [np.random.rand(4,2).tolist(), 
            np.random.rand(5,2).tolist(), 
            np.random.rand(6,2).tolist(), 
            np.random.rand(5,2).tolist(), 
            np.random.rand(9,2).tolist()]
labels = [[1, 1, 1, 1],
          [1, 1, 1, 1, 1],
          [2, 2, 2, 2, 2, 2],
          [2, 2, 2, 2, 2],
          [0, 0, 0, 0, 0, 0, 0, 0, 0]]

fig = go.Figure()
for i, feat in enumerate(features):
    feat = np.array(feat)
    fig.add_trace(
        go.Scatter3d(
            x=np.arange(len(feat)),
            y=feat[:,0],
            z=feat[:,1],
            mode='lines',
            hovertext=labels[i]
        )
    )
fig.show()

相关问题