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:
Czy możliwe jest również narysowanie (losowego) znacznika dla każdej linii?
Z góry dziękuję!
Odpowiedzi:
1 dla odpowiedzi № 1Najpierw 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:
Zmodyfikowano: