vscode-debug-visualizer icon indicating copy to clipboard operation
vscode-debug-visualizer copied to clipboard

could not use graph with interaction

Open minuenergy opened this issue 2 months ago • 0 comments

const fs = require('fs');

function readCSV(filePath) {
    const content = fs.readFileSync(filePath, 'utf-8');
    const lines = content.trim().split('\n');
    const headers = lines[0].split(',').map(h => h.trim());
    const rows = lines.slice(1).map(line => {
        const values = line.split(',').map(v => v.trim());
        const row = {};
        headers.forEach((header, index) => {
            row[header] = values[index];
        });
        return row;
    });
    return { headers, rows };
}

function extractColumnData(rows, columnName) {
    return rows.map((row, index) => ({
        x: index,
        y: parseFloat(row[columnName])
    }));
}

function visualizeSingle(csvPath, columnName) {
    const { rows } = readCSV(csvPath);
    const data = extractColumnData(rows, columnName);
    
    return {
        kind: { plotly: true },
        data: [{
            x: data.map(d => d.x),
            y: data.map(d => d.y),
            type: 'scatter',
            mode: 'lines+markers',
            name: columnName
        }]
    };
}

function visualizeCompare(csvPath, columnNames) {
    const { rows } = readCSV(csvPath);
    
    const colors = [
        '#1f77b4', '#ff7f0e', '#2ca02c', '#d62728', '#9467bd',
        '#8c564b', '#e377c2', '#7f7f7f', '#bcbd22', '#17becf'
    ];
    
    const traces = columnNames.map((columnName, index) => {
        const data = extractColumnData(rows, columnName);
        return {
            x: data.map(d => d.x),
            y: data.map(d => d.y),
            type: 'scatter',
            mode: 'lines+markers',
            name: columnName,
            line: { 
                color: colors[index % colors.length] 
            }
        };
    });
    
    return {
        kind: { plotly: true },
        data: traces
    };
}

function visualize3D(csvPath, xColumn, yColumn, zColumn) {
    const { rows } = readCSV(csvPath);
    
    const xData = rows.map(row => parseFloat(row[xColumn]));
    const yData = rows.map(row => parseFloat(row[yColumn]));
    const zData = rows.map(row => parseFloat(row[zColumn]));
    
    return {
        kind: { plotly: true },
        data: [{
            x: xData,
            y: yData,
            z: zData,
            type: 'scatter3d',
            mode: 'markers',
            marker: {
                size: 4,
                color: zData,
                colorscale: 'Viridis',
                showscale: true,
                colorbar: {
                    title: zColumn,
                    thickness: 15,
                    len: 0.7
                }
            },
            hovertemplate: 
                `<b>${xColumn}</b>: %{x:.4f}<br>` +
                `<b>${yColumn}</b>: %{y:.4f}<br>` +
                `<b>${zColumn}</b>: %{z:.4f}<extra></extra>`
        }],
        layout: {
            scene: {
                xaxis: { title: xColumn },
                yaxis: { title: yColumn },
                zaxis: { title: zColumn },
                camera: {
                    eye: { x: 1.5, y: 1.5, z: 1.5 }
                }
            },
            hovermode: 'closest',
            dragmode: 'orbit'
        },
        config: {
            displayModeBar: true,
            displaylogo: false,
            responsive: true,
            scrollZoom: true
        }
    };
}

function visualize3D_line(csvPath, xColumn, yColumn, zColumn) {
    const { rows } = readCSV(csvPath);
    
    const xData = rows.map(row => parseFloat(row[xColumn]));
    const yData = rows.map(row => parseFloat(row[yColumn]));
    const zData = rows.map(row => parseFloat(row[zColumn]));
    
    return {
        kind: { plotly: true },
        data: [{
            x: xData,
            y: yData,
            z: zData,
            type: 'scatter3d',
            mode: 'lines+markers',
            line: {
                width: 4,
                color: zData,
                colorscale: 'Viridis'
            },
            marker: {
                size: 3,
                color: zData,
                colorscale: 'Viridis',
                showscale: true
            }
        }],
        layout: {
            scene: {
                xaxis: { title: xColumn },
                yaxis: { title: yColumn },
                zaxis: { title: zColumn }
            },
            dragmode: 'orbit'
        },
        config: {
            displayModeBar: true,
            displaylogo: false,
            responsive: true,
            scrollZoom: true
        }
    };
}

function createVisualization(csvPath, config) {
    if (config.type === 'single') {
        return visualizeSingle(csvPath, config.column);
    } else if (config.type === 'compare') {
        return visualizeCompare(csvPath, config.columns);
    } else if (config.type === '3d') {
        return visualize3D(csvPath, config.xColumn, config.yColumn, config.zColumn);
    } else if (config.type === '3d-line') {
        return visualize3D_line(csvPath, config.xColumn, config.yColumn, config.zColumn);
    }
}


// ==================== USAGE ====================

const csvPath = 'tt.csv';

const viz3d_scatter = createVisualization(csvPath, {
    type: '3d',
    xColumn: 'AverageVVals',
    yColumn: 'AveragePenalty',
    zColumn: 'AverageEpRet'
});

const viz3d_line = createVisualization(csvPath, {
    type: '3d-line',
    xColumn: 'AverageVVals',
    yColumn: 'AveragePenalty',
    zColumn: 'AverageEpRet'
});

const viz2d_compare = createVisualization(csvPath, {
    type: 'compare',
    columns: ['AverageVVals','AverageCVVals','AverageAdv','AverageCAdv','AverageLossPi','AverageLossV','AverageRatio','AverageDeltaLossPi',"AverageDeltaLossV",'AverageVVals', 'AveragePenalty', 'AverageClipFrac','AverageKL','AverageEntropy']

});

debugger; 

I'm using this code for my visualizer. It runs fine, but I can't interact with it properly. When I try to zoom, pan, or rotate, the changes only last for a second(almost milisecond) before the graph snaps back to its original view. I can't maintain control over the graph.

minuenergy avatar Dec 03 '25 06:12 minuenergy