Matplotlib Cheat Sheet: ściąga z Matplotlib
Ostatnia aktualizacja
Figure i axes
Figure to cały obraz. Axes to jeden wykres w jego środku, a prawie każde wywołanie poniżej to metoda na ax.
| Zadanie | Kod |
|---|---|
| Import pyplot | import matplotlib.pyplot as plt |
| Jedna figura z jednym wykresem | fig, ax = plt.subplots() |
| Rozmiar w calach | fig, ax = plt.subplots(figsize=(8, 4)) |
| Rysowanie na axes | ax.plot(x, y) |
| Pokaż figurę | plt.show() |
| Zapis jako ostry PNG | fig.savefig("chart.png", dpi=150, bbox_inches="tight") |
| Zapis jako grafika wektorowa | fig.savefig("chart.svg"), fig.savefig("chart.pdf") |
| Przezroczyste tło | fig.savefig("chart.png", transparent=True) |
| Zamknij figurę, by zwolnić pamięć | plt.close(fig) |
| Szybki styl pyplot dla jednego wykresu | plt.plot(x, y)
plt.title("Quick look")
plt.show() |
Typy wykresów
| Zadanie | Kod |
|---|---|
| Wykres liniowy | ax.plot(x, y) |
| Wykres punktowy | ax.scatter(x, y, s=20, alpha=0.7) |
| Punkty kolorowane wartością, z paskiem kolorów | points = ax.scatter(x, y, c=y, cmap="viridis")
fig.colorbar(points, ax=ax) |
| Wykres słupkowy | ax.bar(cats, a) |
| Wykres słupkowy poziomy | ax.barh(cats, a) |
| Słupki skumulowane | ax.bar(cats, a, label="2025")
ax.bar(cats, b, bottom=a, label="2026") |
| Słupki zgrupowane | pos = np.arange(len(cats))
ax.bar(pos - 0.2, a, width=0.4)
ax.bar(pos + 0.2, b, width=0.4)
ax.set_xticks(pos, labels=cats) |
| Histogram | ax.hist(data, bins=30) |
| Wykres pudełkowy | ax.boxplot([data, data * 2], tick_labels=["A", "B"]) |
| Wykres skrzypcowy | ax.violinplot([data, data * 2]) |
| Wykres kołowy | ax.pie([40, 35, 25], labels=cats, autopct="%1.0f%%") |
| Pas między dwiema krzywymi | ax.fill_between(x, y - 0.2, y + 0.2, alpha=0.3) |
| Słupki błędów | ax.errorbar([1, 2, 3], [4, 5, 3], yerr=[0.5, 0.3, 0.6], fmt="o", capsize=4) |
| Wykres schodkowy | ax.step(x, y, where="mid") |
| Mapa ciepła tablicy 2D | image = ax.imshow(np.random.default_rng(0).random((5, 5)), cmap="magma")
fig.colorbar(image, ax=ax) |
| Wypełniony wykres konturowy | X, Y = np.meshgrid(x, x)
ax.contourf(X, Y, np.sin(X) * np.cos(Y), levels=20) |
| Gęstość wielu punktów | ax.hexbin(data, data + np.random.default_rng(1).normal(size=200), gridsize=20) |
| Pozioma lub pionowa linia odniesienia | ax.axhline(0, color="gray", linestyle="--"), ax.axvline(5) |
| Zacieniowany zakres | ax.axvspan(2, 4, alpha=0.2) |
Linie, markery i kolory
| Zadanie | Kod |
|---|---|
| Kolor, grubość i styl linii | ax.plot(x, y, color="tab:red", linewidth=2, linestyle="--") |
| Markery na punktach | ax.plot(x, y, marker="o", markersize=4) |
| Krótki format w stringu | ax.plot(x, y, "g--o") |
| Przezroczystość | ax.plot(x, y, alpha=0.5) |
| Style linii | "-", "--", "-.", ":" |
| Kody markerów | "o", "s", "^", "x", ".", "*" |
| Sposoby podania koloru | "tab:blue", "C1", "#1f77b4", (0.2, 0.4, 0.6) |
| n kolorów z mapy kolorów | colors = plt.colormaps["viridis"](np.linspace(0, 1, 5)) |
| Własny cykl kolorów | ax.set_prop_cycle(color=["#0b7285", "#e8590c", "#5f3dc4"]) |
| Słupki z obrysem i kreskowaniem | ax.bar(cats, a, color="white", edgecolor="black", hatch="//") |
Tytuły, etykiety i legendy
| Zadanie | Kod |
|---|---|
| Tytuł i opisy osi | ax.set_title("Sales"), ax.set_xlabel("Month"), ax.set_ylabel("EUR") |
| Wszystko w jednym wywołaniu | ax.set(title="Sales", xlabel="Month", ylabel="EUR") |
| Legenda z etykiet linii | ax.plot(x, y, label="sin")
ax.legend() |
| Pozycja i kolumny legendy | ax.legend(loc="upper right", ncols=2, frameon=False) |
| Legenda poza wykresem | ax.legend(loc="center left", bbox_to_anchor=(1, 0.5)) |
| Tekst w punkcie danych | ax.text(5, 0.5, "note") |
| Adnotacja ze strzałką | ax.annotate("peak", xy=(1.57, 1), xytext=(3, 1.2), arrowprops=dict(arrowstyle="->")) |
| Wartości na słupkach | bars = ax.bar(cats, a)
ax.bar_label(bars) |
| Tytuł całej figury | fig.suptitle("Q1 report") |
| Wzory matematyczne w etykietach | ax.set_xlabel(r"$\alpha$ (rad)") |
Osie, znaczniki i skale
| Zadanie | Kod |
|---|---|
| Zakresy osi | ax.set_xlim(0, 10), ax.set_ylim(bottom=0) |
| Skala logarytmiczna | ax.set_yscale("log") |
| Wybór znaczników i ich etykiet | ax.set_xticks([0, 5, 10], labels=["start", "middle", "end"]) |
| Obrót etykiet znaczników | ax.tick_params(axis="x", labelrotation=45) |
| Linie siatki | ax.grid(True, alpha=0.3) |
| Oś w procentach | from matplotlib.ticker import PercentFormatter
ax.yaxis.set_major_formatter(PercentFormatter(1.0)) |
| Separator tysięcy | ax.yaxis.set_major_formatter("{x:,.0f}") |
| Ukryj górną i prawą ramkę | ax.spines[["top", "right"]].set_visible(False) |
| Druga oś y po prawej | ax2 = ax.twinx()
ax2.plot(x, y * 100, color="tab:orange") |
| Ta sama skala na obu osiach | ax.set_aspect("equal") |
| Odwróć oś | ax.invert_yaxis() |
| Całkowicie ukryj osie | ax.axis("off") |
| Czytelne etykiety dat | fig.autofmt_xdate() |
Subploty i układ
plt.subplots(rows, cols) zwraca tablicę NumPy z axes. Indeksuj ją jak zwykłą tablicę.
| Zadanie | Kod |
|---|---|
| Siatka wykresów | fig, axs = plt.subplots(2, 2, figsize=(8, 6)) |
| Rysowanie na jednym z nich | axs[0, 1].plot(x, y) |
| Pętla po wszystkich | for ax in axs.flat:
ax.grid(True) |
| Wspólna oś dla wykresów | fig, axs = plt.subplots(1, 3, sharey=True) |
| Odstępy bez nachodzenia | fig, axs = plt.subplots(2, 2, layout="constrained") |
| Usuń nachodzenie po rysowaniu | fig.tight_layout() |
| Kolumny o różnej szerokości | fig, axs = plt.subplots(1, 2, width_ratios=[3, 1]) |
| Nazwany układ z szerokim panelem | fig, axd = plt.subplot_mosaic([["top", "top"], ["left", "right"]])
axd["top"].plot(x, y) |
| Mały wykres wewnątrz wykresu | inset = ax.inset_axes([0.6, 0.6, 0.35, 0.35]) |
| Ukryj pusty panel | axs[0].axis("off") |
Style i ustawienia domyślne
| Zadanie | Kod |
|---|---|
| Wbudowany styl | plt.style.use("ggplot") |
| Lista stylów | plt.style.available |
| Wygląd seaborn bez seaborn | plt.style.use("seaborn-v0_8-whitegrid") |
| Styl tylko dla jednej figury | with plt.style.context("dark_background"):
fig, ax = plt.subplots() |
| Domyślny rozmiar czcionki | plt.rcParams["font.size"] = 12 |
| Domyślny rozmiar i rozdzielczość figury | plt.rcParams["figure.figsize"] = (8, 4), plt.rcParams["figure.dpi"] = 120 |
| Powrót do ustawień domyślnych | plt.style.use("default") |
| Popularne mapy kolorów: sekwencyjne, rozbieżne, szare | "viridis", "coolwarm", "Greys" |
Wykresy z pandas
pandas rysuje za pomocą Matplotlib. Przekaż ax=, żeby rysować na własnych axes, albo zachowaj ax, które zwraca pandas.
| Zadanie | Kod |
|---|---|
| Kolumny DataFrame'u na twoich axes | df.plot(x="month", y="sales", ax=ax) |
| Wykres słupkowy podsumowania grup | df.groupby("city")["sales"].sum().plot.bar(ax=ax) |
| Dalsze stylowanie wykresu z pandas | ax = df.plot(x="month", y="sales")
ax.set_title("Sales") |
| Kolumny prosto do Matplotlib | ax.plot(df["month"], df["sales"]) |
Matplotlib 3.11: stare zapisy i co pisać teraz
Kod skopiowany ze starszych tutoriali może w Matplotlib 3.11 rzucić błąd albo ostrzeżenie. Używaj zapisów z kolumny Matplotlib 3.11.
| Zadanie | Matplotlib 3.11 | Stary zapis |
|---|---|---|
| Etykiety wykresu pudełkowego | ax.boxplot([data, data * 2], tick_labels=["A", "B"]) | labels=["A", "B"] |
| Poziomy wykres pudełkowy lub skrzypcowy | ax.boxplot(data, orientation="horizontal") | vert=False |
| Pobranie mapy kolorów | plt.colormaps["viridis"] | plt.cm.get_cmap("viridis") |
| Styl seaborn | plt.style.use("seaborn-v0_8") | plt.style.use("seaborn") |
Kod Matplotlib, który zamienia dane w czytelny wykres, pogrupowany według zadań: figure i axes, typy wykresów, linie i kolory, tytuły i legendy, osie i znaczniki, subploty i układ, style oraz wykresy z pandas. Każdy wiersz to krótki fragment kodu do wklejenia i jedno zdanie o tym, co robi.
Wszystko tutaj używa stylu obiektowego (fig, ax = plt.subplots(), a potem metody na ax) i jest napisane dla Matplotlib 3.11, wersji, której używa Coddy. Starsze zapisy, takie jak labels= w boxplot, pojawiają się tylko w ostatniej tabeli, obok tego, co pisać zamiast nich. Przykłady używają x = np.linspace(0, 10, 50), y = np.sin(x) i próbki wartości z rozkładu normalnego o nazwie data. Dopiero zaczynasz z Pythonem? Zajrzyj do ściągi z Pythona, a obok tej ściągi trzymaj też ściągi z pandas, NumPy i scikit-learn.
FAQ: ściąga z Matplotlib
Czy ta ściąga z Matplotlib jest darmowa?
Czym różni się plt od ax?
plt.plot() rysuje na bieżących axes, co jest wygodne przy pojedynczym wykresie. fig, ax = plt.subplots() daje ci figurę i axes jako obiekty, więc ax.plot() zawsze rysuje dokładnie tam, gdzie chcesz. Używaj stylu z ax wszędzie tam, gdzie jest więcej niż jeden wykres, i w kodzie, który zostanie na dłużej.Jak zmienić rozmiar figury?
figsize w calach przy tworzeniu figury: fig, ax = plt.subplots(figsize=(10, 5)). Żeby zmienić wartość domyślną dla każdej figury, ustaw plt.rcParams["figure.figsize"] = (10, 5). Rozmiar zapisanego pliku w pikselach to figsize razy dpi.Jak zapisać wykres w wysokiej rozdzielczości?
fig.savefig("chart.png", dpi=300, bbox_inches="tight"). Wyższe dpi daje ostrzejszy PNG, a bbox_inches="tight" przycina puste marginesy. Do druku lub prezentacji zapisz SVG albo PDF, które są ostre w każdym rozmiarze.Dlaczego tytuły i etykiety subplotów na siebie nachodzą?
layout="constrained", na przykład plt.subplots(2, 2, layout="constrained"), a Matplotlib zrobi miejsce na tytuły, etykiety i paski kolorów. Na istniejącej figurze wywołaj fig.tight_layout() po narysowaniu.Którą wersję Matplotlib obejmuje ta ściąga?
labels= w boxplot (teraz tick_labels=) i plt.cm.get_cmap (teraz plt.colormaps[...]), są w ostatniej tabeli obok tego, co pisać zamiast nich.