Obecnie jeśli ustawić matplotlib y oś ticklabels do trybu naukowej daje mi wykładnik w górnej części osi y postaci 1e-5
dostosować tekst wykładnik po ustawieniu limitów naukowe dotyczące matplotlib oś
chciałbym aby dostosować to do odczytu r'$\mathregular{10^{-5}}$'
, aby ładnie się ładowało.
Oto mój przykładowy kod:
# Create a figure and axis
fig, ax = plt.subplots()
# Plot 100 random points
# the y values of which are very small
ax.scatter(np.random.rand(100), np.random.rand(100)/100000.0)
# Set the y limits appropriately
ax.set_ylim(0, 1/100000.0)
# Change the y ticklabel format to scientific format
ax.ticklabel_format(axis='y', style='sci', scilimits=(-2, 2))
# Get the offset value
offset = ax.yaxis.get_offset_text()
# Print it out
print '1st offset printout: {}'.format(offset)
# Run plt.tight_layout()
plt.tight_layout()
# Print out offset again - you can see the value now!
print '2nd offset printout: {}'.format(offset)
# Change it to latex format
offset.set_text(r'$\mathregular{10^{-5}}$')
# Print it out
print '3rd offset printout: {}'.format(offset)
# Add some text to the middle of the figure just to
# check that it isn't the latex format that's the problem
ax.text(0.5, 0.5/100000.0, r'$\mathregular{10^{-2}}$')
# And show the figure
plt.show()
moje wyjście wygląda następująco:
1st offset printout: Text(0,0.5,u'')
2nd offset printout: Text(0,636.933,u'1e\u22125')
3rd offset printout: Text(0,636.933,u'$\\mathregular{10^{-5}}$')
Można znaleźć kod i wyjściową postać here.
Istnieją dwie osobliwości: Jedna to to, że nie mogę nadpisać wartości 1e-5 na górze osi Y (która jest celem), a drugą jest to, że muszę uruchomić plt.tight_layout()
, aby zobaczyć nawet ta wartość Unicode jako przesunięcie.
Czy ktoś może mi powiedzieć, gdzie idę źle?
Dziękuję
EDIT: Oryginalny pytanie nie wyjaśnić, że chciałbym, aby automatycznie wykryć jako wykładnik jest obecnie obliczane przez ticklabel_format
. Zamiast więc przekazywać ustalony ciąg do tekstu korekcji, powinien automatycznie wykryć tę wartość i odpowiednio dopasować łańcuch lateksowy.
Bardzo zadbane. Zakładam, że jest to błąd w matplotlib, ponieważ powinieneś być w stanie zastąpić ciąg 'offsettext' bezpośrednio. Twój opis jest nieco mylący - nie dodajesz tego ciągu, ale wyłącza "offsettext" i umieszczasz etykietę latex w tym samym miejscu. Idealnie tekst zastępujący byłby oparty na położeniu 'ax_axis.get_offset_text(). Get_position()'. Nie mogłem znaleźć sposobu na zrobienie tego, ponieważ 'pos' jest w jednostkach pikselowych (chyba), prawda? –
Masz rację - teraz zmienię swoje odniesienie do "pos" w odpowiedzi. Nie mogłem wymyślić, co zrobić z tymi liczbami (w rzeczywistości - nie przyszło mi do głowy, że są to współrzędne pikseli - dobrze zgadnij!). Czy masz jakieś sugestie, w jaki sposób uzyskać wartości do aktualizacji bez wykonywania plt.tight_layout()? – KirstieJane