Możesz utworzyć duży podplot obejmujący dwa podploty, a następnie ustawić wspólne etykiety.
import random
import matplotlib.pyplot as plt
x = range(1, 101)
y1 = [random.randint(1, 100) for _ in xrange(len(x))]
y2 = [random.randint(1, 100) for _ in xrange(len(x))]
fig = plt.figure()
ax = fig.add_subplot(111) # The big subplot
ax1 = fig.add_subplot(211)
ax2 = fig.add_subplot(212)
# Turn off axis lines and ticks of the big subplot
ax.spines['top'].set_color('none')
ax.spines['bottom'].set_color('none')
ax.spines['left'].set_color('none')
ax.spines['right'].set_color('none')
ax.tick_params(labelcolor='w', top=False, bottom=False, left=False, right=False)
ax1.loglog(x, y1)
ax2.loglog(x, y2)
# Set common labels
ax.set_xlabel('common xlabel')
ax.set_ylabel('common ylabel')
ax1.set_title('ax1 title')
ax2.set_title('ax2 title')
plt.savefig('common_labels.png', dpi=300)
Innym sposobem jest użycie rys.text () do bezpośredniego ustawienia wspólnych etykiet.
import random
import matplotlib.pyplot as plt
x = range(1, 101)
y1 = [random.randint(1, 100) for _ in xrange(len(x))]
y2 = [random.randint(1, 100) for _ in xrange(len(x))]
fig = plt.figure()
ax1 = fig.add_subplot(211)
ax2 = fig.add_subplot(212)
ax1.loglog(x, y1)
ax2.loglog(x, y2)
# Set common labels
fig.text(0.5, 0.04, 'common xlabel', ha='center', va='center')
fig.text(0.06, 0.5, 'common ylabel', ha='center', va='center', rotation='vertical')
ax1.set_title('ax1 title')
ax2.set_title('ax2 title')
plt.savefig('common_labels_text.png', dpi=300)
ax
musi zostać utworzone przedax1
iax2
, inaczej duża działka pokryje małych działek.Jeden prosty sposób przy użyciu
subplots
:źródło
'off'
naFalse
nowsze wersje Matplotlib (mam 2.2.2)for ax in axes: ax.plot(x, y)
wydaje się nie robić nic dobrego.Odpowiedź Wen-wei Liao jest dobra, jeśli nie próbujesz eksportować grafiki wektorowej lub jeśli masz ustawione zaplecze matplotlib, aby ignorować bezbarwne osie; w przeciwnym razie ukryte osie pojawią się na eksportowanej grafice.
Moja odpowiedź
suplabel
tutaj jest podobna do tej,fig.suptitle
która korzysta zfig.text
funkcji. Dlatego nie ma żadnego artysty tworzącego siekiery i bezbarwnego. Jeśli jednak spróbujesz wywołać go wiele razy, tekst zostanie dodany jeden na drugim (tak jak ifig.suptitle
to). Odpowiedź Wen-wei Liao nie, ponieważfig.add_subplot(111)
zwróci ten sam obiekt Axes, jeśli jest już utworzony.Moją funkcję można również wywołać po utworzeniu wykresów.
źródło
Oto rozwiązanie, w którym ustawisz etykietę jednego z wykresów i dostosujesz jego położenie tak, aby była wyśrodkowana pionowo. W ten sposób unikniesz problemów wymienionych przez KYC.
źródło
plt.setp()
wykona zadanie:źródło
źródło
Metody w pozostałych odpowiedziach nie będą działały poprawnie, gdy tagi są duże. Ylabel będzie albo nakładał się na kleszcze, zostanie przypięty po lewej stronie lub całkowicie niewidoczny / na zewnątrz figury.
Zmodyfikowałem odpowiedź Hagne'a, aby działała z więcej niż 1 kolumną wykresów podrzędnych, zarówno dla xlabel, jak i ylabel, i przesuwa fabułę, aby utrzymać ylabel widoczny na rysunku.
Działa w następującym przykładzie, podczas gdy odpowiedź Hagne'a nie rysuje ylabel (ponieważ jest poza płótnem), a ylabel KYC pokrywa się z etykietami zaznaczenia:
Alternatywnie, jeśli jesteś w porządku z bezbarwną osią, zmodyfikowałem rozwiązanie Juliana Chena, aby ylabel nie nakładał się na etykiety kleszczowe.
Zasadniczo musimy po prostu ustawić ylimy bezbarwne, aby pasowały one do największych ylimów podplotów, aby bezbarwne etykiety kleszczy ustawiły właściwą lokalizację dla ylabel.
Ponownie musimy zmniejszyć fabułę, aby zapobiec wycinaniu. Tutaj zakodowałem na stałe kwotę do zmniejszenia, ale możesz pobawić się, aby znaleźć liczbę, która będzie dla ciebie odpowiednia, lub obliczyć ją jak w powyższej metodzie.
źródło