/ / Pandas Dataframe Line Plot: Pokaż losowe znaczniki - python, pandy, matplotlib

Pandas Dataframe Line Plot: Pokaż losowe markery - python, pandy, matplotlib

Często posiadam ramki danych z wieloma obserwacjami i chcę rzucić okiem na dane za pomocą wykresu liniowego.

Problem polega na tym, że kolory mapy kolorów są powtarzane w X obserwacjach lub trudne do odróżnienia np. w przypadku sekwencyjnych map kolorów.

Więc moim pomysłem było dodanie losowych znaczników do wykresu linii, w którym utknąłem.

Oto przykład z jednym znacznikiem:

# -*- coding: utf-8 -*-
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# dataframe with random data
df = pd.DataFrame(np.random.rand(10, 8))

# plot
df.plot(kind="line", marker="d")
plt.show()

który dostarcza:

wprowadź opis obrazu tutaj

Czy możliwe jest również narysowanie (losowego) znacznika dla każdej linii?

Z góry dziękuję!

Odpowiedzi:

1 dla odpowiedzi № 1

Najpierw musimy wybrać losowy znacznik. Można to zrobić za pośrednictwem matplotlib.markers.MarkerStyle.markers słownik zawierający wszystkie dostępne znaczniki. Również znaczniki oznaczają „nic”, zaczynając od „tick” i „caret” należy upuścić Informacja znaczniki abour. Zróbmy listę z poprawnymi znacznikami, a następnie wybierzmy losowo spośród nich, ile potrzebujemy do wydrukowania DataFrame lub można użyć drugiej opcji z filled_markers:

import matplotlib as mpl
import numpy as np

# create valid markers from mpl.markers
valid_markers = ([item[0] for item in mpl.markers.MarkerStyle.markers.items() if
item[1] is not "nothing" and not item[1].startswith("tick")
and not item[1].startswith("caret")])

# use fillable markers
# valid_markers = mpl.markers.MarkerStyle.filled_markers

markers = np.random.choice(valid_markers, df.shape[1], replace=False)

Na przykład:

In [146]: list(markers )
Out[146]: ["H", "^", "v", "s", "3", ".", "1", "_"]

Następnie dla znaczników możesz wykreślić ramkę danych i ustawić znaczniki dla każdej linii przez set_marker metoda. Następnie możesz dodać legendę do swojej fabuły:

import pandas as pd

np.random.seed(2016)
df = pd.DataFrame(np.random.rand(10, 8))

ax = df.plot(kind="line")
for i, line in enumerate(ax.get_lines()):
line.set_marker(markers[i])

# for adding legend
ax.legend(ax.get_lines(), df.columns, loc="best")

Oryginalny:

wprowadź opis obrazu tutaj

Zmodyfikowano:

wprowadź opis obrazu tutaj