plotly / plotly/plotly.py

[BUG] Data in `px.imshow` disappears at default zoom, reappears when zooming in with dense data

Ouverte
#5,209 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

bug P2
Langage dominant
Python
Étoiles
18.8k
Forks
2.8k
Merge moyen
16 h 26 min
PR mergées (30 j)
21

Description

Environment
Plotly Version: 6.1.2
Operating System: Windows 10 22H2 19045.5854 Windows Feature Experience Pack 1000.19061.1000.0
Browser: Chrome 137.0.7151.41

When trying to visualize dense binary time-series data (e.g., 10 channels over 4,000+ time points), both px.imshow and px.timeline fail to render the data correctly in the default, zoomed-out view. The areas that should contain data appear blank.

However, if you manually zoom into any region of the plot, the data correctly appears. Resetting the zoom causes the data to disappear again. This suggests the issue is not with the data itself, but with the rendering engine's handling of very thin graphical elements (heatmap cells or gantt bars) at a low zoom level.

Here is my origin data.
BAO_spikes_sorted_output.csv

Here is my html.(Please change the suffix to html)

BAO Spike Heatmap.txt

Here is my code.

def plot_binary_heatmap(csv_file="./data/down/combined_binary.csv", title="Binary Heatmap of Signals"):
    """
    Reads data from a combined binary CSV, processes filenames, and plots a heatmap.
    The x-axis represents time in seconds, and the y-axis represents file numbers in ascending order.
    """
    df = pd.read_csv(csv_file)

    # 1. Extract the time column (keep as float)
    if 'Time' in df.columns:
        time = df['Time'].astype(float)
        df = df.drop(columns=['Time'])
    elif 'time' in df.columns:
        time = df['time'].astype(float)
        df = df.drop(columns=['time'])
    else:
        # If no time column exists, create an index
        time = pd.Series(range(df.shape[0]))

    # 2. Transpose: each row is a file, each column is a time point
    df_t = df.T
    df_t.index.name = "File"

    # Update index, keep only the part before "_"
    df_t.index = df_t.index.to_series().str.split('_').str[0]

    # 3. Set time as column names (keep as float)
    df_t.columns = time

    z = df_t.to_numpy()
    y_labels = df_t.index.tolist()
    x_values = df_t.columns.to_numpy()

    # 4. Create the heatmap
    fig = px.imshow(
        z,
        labels=dict(x="Time (s)", y="Channel", color="Binary"),
        x=x_values,
        y=y_labels,
        color_continuous_scale=["#ffffff", "#000000"],
        aspect="auto",
        title=title
    )

    # 5. Update chart layout
    fig.update_layout(
        xaxis_title="Time (s)",
        yaxis_title="Channel",
        height=600,
        width=1000,
    )

    fig.write_html(f"{title}.html")

plot_binary_heatmap(csv_file="BAO_spikes_sorted_output.csv", title="BAO Spike Heatmap")

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Commencez par reproduire le rapport avec le fichier joint BAO_spikes_sorted_output.csv, l’exemple Python px.imshow fourni et Plotly 6.1.2, en comparant la vue par défaut à une vue agrandie. C’est terminé lorsque les données d’une heatmap binaire dense restent visibles sans zoom manuel et que le comportement est vérifié avec le cas fourni.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
plotly, python
Domaine
data-visualization
Type d'issue
Bug
Difficulté
4/5
Temps estimé
3-5 jours
Activité
À l'abandon
Clarté
À clarifier
Accessibilité débutants
35/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.