Wiem, że jeśli zmienię szerokość linii linii, zostanie ona automatycznie zaktualizowana w legendzie. Chciałbym jednak zmienić szerokość linii legendy bez wpływu na fabułę.Zwiększ szerokość linii linii legendy w matplotlib
Odpowiedz
Oto prosty przykład jak to zrobić:
import numpy as np
import matplotlib.pyplot as plt
# make some data
x = np.linspace(0, 2*np.pi)
y1 = np.sin(x)
y2 = np.cos(x)
# plot sin(x) and cos(x)
p1 = plt.plot(x, y1, 'b-', linewidth=1.0)
p2 = plt.plot(x, y2, 'r-', linewidth=1.0)
# make a legend for both plots
leg = plt.legend([p1, p2], ['sin(x)', 'cos(x)'], loc=1)
# set the linewidth of each legend object
for legobj in leg.legendHandles:
legobj.set_linewidth(2.0)
plt.show()
Jeśli chcesz zmienić wszystkie linie na wykresie, to może być przydatne, aby zdefiniować własne obsługi Legenda:
import matplotlib.pyplot as plt
from matplotlib import legend_handler
from matplotlib.lines import Line2D
import numpy as np
class MyHandlerLine2D(legend_handler.HandlerLine2D):
def create_artists(self, legend, orig_handle,
xdescent, ydescent, width, height, fontsize,
trans):
xdata, xdata_marker = self.get_xdata(legend, xdescent, ydescent,
width, height, fontsize)
ydata = ((height-ydescent)/2.)*np.ones(xdata.shape, float)
legline = Line2D(xdata, ydata)
self.update_prop(legline, orig_handle, legend)
#legline.update_from(orig_handle)
#legend._set_artist_props(legline) # after update
#legline.set_clip_box(None)
#legline.set_clip_path(None)
legline.set_drawstyle('default')
legline.set_marker("")
legline.set_linewidth(10)
legline_marker = Line2D(xdata_marker, ydata[:len(xdata_marker)])
self.update_prop(legline_marker, orig_handle, legend)
#legline_marker.update_from(orig_handle)
#legend._set_artist_props(legline_marker)
#legline_marker.set_clip_box(None)
#legline_marker.set_clip_path(None)
legline_marker.set_linestyle('None')
if legend.markerscale != 1:
newsz = legline_marker.get_markersize()*legend.markerscale
legline_marker.set_markersize(newsz)
# we don't want to add this to the return list because
# the texts and handles are assumed to be in one-to-one
# correpondence.
legline._legmarker = legline_marker
return [legline, legline_marker]
plt.plot([0, 1], [0, 1], '-r', lw=1, label='Line')
plt.legend(handler_map={Line2D:MyHandlerLine2D()})
plt.show()
Metoda @Bndndana Wooda wykorzystuje api dostarczone przez pyplot
. W matplotlib, object oriented style using axes is prefered. Oto, jak można to osiągnąć, używając metody axes
.
import numpy as np
import matplotlib.pyplot as plt
# make some data
x = np.linspace(0, 2*np.pi)
y1 = np.sin(x)
y2 = np.cos(x)
fig, ax = plt.subplots()
ax.plot(x, y1, linewidth=1.0, label='sin(x)')
ax.plot(x, y2, linewidth=1.0, label='cos(x)')
leg = ax.legend()
for line in leg.get_lines():
line.set_linewidth(4.0)
plt.show()
domyślnie Legenda zawiera samych linii. Dlatego zmiana szerokości linii linii w obszarze roboczym zmieni również linie w legendzie (i odwrotnie, ponieważ są one w zasadzie tym samym obiektem).
Możliwe rozwiązanie polega na użyciu kopii artysty z płótna i zmianie tylko jego szerokości linii.
import numpy as np
import matplotlib.pyplot as plt
import copy
x = np.linspace(0, 2*np.pi)
y1 = np.sin(x)
y2 = np.cos(x)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x, y1, c='b', label='y1',linewidth=1.0)
ax.plot(x, y2, c='r', label='y2')
# obtain the handles and labels from the figure
handles, labels = ax.get_legend_handles_labels()
# copy the handles
handles = [copy.copy(ha) for ha in handles ]
# set the linewidths to the copies
[ha.set_linewidth(7) for ha in handles ]
# put the copies into the legend
leg = plt.legend(handles=handles, labels=labels)
plt.savefig('leg_example')
plt.show()
Innym rozwiązaniem byłoby użyć i funkcję handler_map
aktualizacji. Jest to w jakiś sposób automatyczne, określając mapę handler'a, automatycznie tworzy dowolną linię w legendzie o szerokości 7 punktów.
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.legend_handler import HandlerLine2D
x = np.linspace(0, 2*np.pi)
y1 = np.sin(x)
y2 = np.cos(x)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x, y1, c='b', label='y1',linewidth=1.0)
ax.plot(x, y2, c='r', label='y2')
linewidth=7
def update(handle, orig):
handle.update_from(orig)
handle.set_linewidth(7)
plt.legend(handler_map={plt.Line2D : HandlerLine2D(update_func=update)})
plt.show()
Wynik jest taki sam jak powyżej.
- 1. Java2D: Zwiększ szerokość linii
- 2. Określanie szerokości linii ramki legendy, w matplotlib
- 3. Jak zmienić szerokość linii kreskowania w matplotlib?
- 4. Szerokość linii w raphaeljs
- 5. Jak zrobić szerokość linii jednej zmiany linii w funkcji x w matplotlib?
- 6. Matplotlib wypełnić wiele linii
- 7. Szerokość linii OpenGL
- 8. matplotlib - kontrolka w kolekcji linii/duża liczba linii
- 9. Pole tekstowe z zawijaniem linii w matplotlib?
- 10. Zmiana właściwości linii w wykresie kołowym matplotlib
- 11. Zmień styl linii w stylu matplotlib
- 12. Centrowanie linii zerwana etykieta osi w matplotlib
- 13. Matplotlib: Pozioma długość Linii w legendzie
- 14. Etykiety punktów i linii w matplotlib?
- 15. rysowanie linii pomiędzy dwoma działek w matplotlib
- 16. matplotlib/pandy: umieść etykietę linii wzdłuż kreślonych linii na wykresie szeregu czasowego
- 17. Obrót pionowy legendy Matplotlib
- 18. matplotlib: wyrównanie tytułu legendy
- 19. legendy linii produkcyjnej do geom_density w ggplot2 w R
- 20. Jak połączyć kolor, styl linii i legendy kształt w ggplot
- 21. Rysowanie linii średniej na histogramie (matplotlib)
- 22. Wypełnianie powyżej/poniżej linii działki matplotlib
- 23. Dopasowywanie linii siatki na rysunku 3D Matplotlib
- 24. matplotlib - zmiana koloru znacznika wzdłuż linii działki
- 25. Jak zmienić szerokość obrysu wzdłuż ścieżki/linii?
- 26. Szerokość obrysu z typem pierwotnym linii SceneKit
- 27. iOS. Określ ostatnią szerokość linii UILabel
- 28. Uzyskaj szerokość ostatniej linii multilinii UILabel
- 29. Zwiększ szerokość pola autouzupełniania md
- 30. Zwiększ szerokość menu rozwijanego bootstrap
miło, szukałem tego wcześniej. Mam nadzieję, że zostanie to zaakceptowane;] – Alnitak
@Alnitak Zaktualizowałem tę odpowiedź za pomocą innej opcji. – ImportanceOfBeingErnest