Jak mogę zrobić pusty wykres podrzędny w matplotlib?

86

Tworzę grupę subplot (powiedzmy 3 x 2) w matplotlib, ale mam mniej niż 6 zestawów danych. Jak mogę uczynić pozostały wykres pomocniczy pusty?

Aranżacja wygląda następująco:

+----+----+
| 0,0| 0,1|
+----+----+
| 1,0| 1,1|
+----+----+
| 2,0| 2,1|
+----+----+

Może to trwać przez kilka stron, ale na ostatniej stronie znajduje się na przykład 5 zestawów danych, w których pole 2,1 będzie puste. Jednak zadeklarowałem liczbę jako:

cfig,ax = plt.subplots(3,2)

Tak więc w przestrzeni dla podpunktu 2,1 znajduje się domyślny zestaw osi ze znacznikami i etykietami. Jak programowo wyrenderować tę przestrzeń jako pustą i pozbawioną osi?

mishaF
źródło

Odpowiedzi:

144

Zawsze możesz ukryć osie, których nie potrzebujesz. Na przykład poniższy kod całkowicie wyłącza szóstą oś:

import matplotlib.pyplot as plt

hf, ha = plt.subplots(3,2)
ha[-1, -1].axis('off')

plt.show()

i daje następujący rysunek:

Obraz siatki wykresów 3x2 bez renderowanego wykresu w prawej dolnej komórce

Alternatywnie, zobacz zaakceptowaną odpowiedź na pytanie Ukrywanie tekstu osi na wykresach matplotlib w celu zachowania osi, ale ukrycia wszystkich dekoracji osi (np. Znaczników i etykiet).

Chris
źródło
Dzięki - to właściwie jeszcze bliżej mojego pierwotnego pytania. Zaakceptowałem już drugą odpowiedź i dostosowałem mój kod, aby jej używać, ale oba podejścia są świetne.
mishaF,
Fajnie, to naprawdę fajne, ponieważ jest mniej add_subplot()bałaganu.
moooeeeep
To jest cudowne!
FaCoffee
To nie pokazuje żadnej fabuły i można powiedzieć, że jest to pusta fabuła. Szukałem wykresu, który nie ma danych, aby wyraźnie pokazać, że nie ma danych. Jakakolwiek łatwa modyfikacja tej odpowiedzi, która to robi?
Zelphir Kaltstahl
@Zelphir Nie jestem pewien, czego szukasz: pozostałe pięć wykresów to puste wykresy bez danych, więc nie jestem pewien, o co prosisz. To także nowe pytanie. W przyszłości zadawaj to nowe pytanie, zamiast komentować starą odpowiedź.
Chris,
26

Od czasu pierwszego zadania tego pytania do matplotlib dodano znacznie ulepszony interfejs subplot. Tutaj możesz stworzyć dokładnie takie podploty, których potrzebujesz, bez ukrywania dodatków. Ponadto wykresy podrzędne mogą obejmować dodatkowe wiersze lub kolumny.

import pylab as plt

ax1 = plt.subplot2grid((3,2),(0, 0))
ax2 = plt.subplot2grid((3,2),(0, 1))
ax3 = plt.subplot2grid((3,2),(1, 0))
ax4 = plt.subplot2grid((3,2),(1, 1))
ax5 = plt.subplot2grid((3,2),(2, 0))

plt.show()

wprowadź opis obrazu tutaj

Haczykowaty
źródło
Wow - to niezła poprawa. O wiele prostsze! Dzięki @Hooked!
mishaF
@Hooked, ta ostatnia pusta przestrzeń jest idealna do dodania legendy. Czy znasz jakiś sposób na ustanowienie tam legendy?
Stefano
@Stefano na pewno istnieją sposoby na zrobienie tego - ale najlepiej byłoby to postawić jako nowe pytanie, możesz nawet połączyć tę odpowiedź w swoim pytaniu (przy okazji witamy w StackOverflow!)
Hooked
7

Możliwe jest również ukrycie wykresu cząstkowego za pomocą metody Axes.set_visible ().

import matplotlib.pyplot as plt
import pandas as pd

fig = plt.figure()
data = pd.read_csv('sampledata.csv')

for i in range(0,6):
ax = fig.add_subplot(3,2,i+1)
ax.plot(range(1,6), data[i])
if i == 5:
    ax.set_visible(False)
Nick Hunkins
źródło
Twoja odpowiedź jest świetna zarówno dla oryginalnych Axes, jak i rozszerzonych GeoAxes!
Fei Yao
1

Czy byłaby to opcja tworzenia działek podrzędnych, kiedy ich potrzebujesz?

import matplotlib
matplotlib.use("pdf")
import matplotlib.pyplot as plt

plt.figure()
plt.gcf().add_subplot(421)
plt.fill([0,0,1,1],[0,1,1,0])
plt.gcf().add_subplot(422)
plt.fill([0,0,1,1],[0,1,1,0])
plt.gcf().add_subplot(423)
plt.fill([0,0,1,1],[0,1,1,0])
plt.suptitle("Figure Title")
plt.gcf().subplots_adjust(hspace=0.5,wspace=0.5)
plt.savefig("outfig")
moooeeeep
źródło
Nie sądzę, ponieważ muszę zrobić inne rzeczy związane z formatowaniem, których nie uwzględniłem w pierwotnym pytaniu ze względu na zwięzłość. Jednym z nich jest plt.subplots_adjust (wspace = 0, hspace = 0). Nie jestem pewien, czy to zadziała po fakcie.
mishaF,
@mishaF: możesz wykonać subplots_adjust () używając tego podejścia. Zobacz moją edycję.
moooeeeep,