Tôi biết rằng nếu tôi thay đổi độ rộng của một dòng, nó sẽ tự động được cập nhật trong chú giải. Tuy nhiên, tôi muốn thay đổi dòng truyền thuyết mà không ảnh hưởng đến cốt truyện.tăng độ rộng của các dòng chú giải trong matplotlib
Trả lời
Dưới đây là một ví dụ đơn giản về cách để làm điều đó:
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()
Nếu bạn muốn thay đổi tất cả các dòng trong một âm mưu, nó có thể có ích để xác định xử lý huyền thoại của riêng bạn:
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()
Phương pháp của @Brendan Wood sử dụng api được cung cấp bởi pyplot
. Trong matplotlib, object oriented style using axes is prefered. Sau đây là cách bạn có thể đạt được điều này bằng phương pháp 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()
Theo mặc định, huyền thoại chứa các dòng họ. Do đó việc thay đổi độ rộng của các dòng trong canvas cũng sẽ thay đổi các dòng trong chú giải (và ngược lại, vì chúng chủ yếu là cùng một đối tượng).
Một giải pháp khả thi là sử dụng bản sao của nghệ sĩ từ canvas và chỉ thay đổi độ rộng của bản sao.
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()
Một lựa chọn khác nhau sẽ được sử dụng một và một chức năng handler_map
cập nhật. Điều này là bằng cách nào đó tự động, xác định bản đồ xử lý sẽ tự động làm cho bất kỳ dòng trong huyền thoại 7 điểm rộng.
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()
Kết quả giống như trên.
- 1. Đặt độ mờ biểu tượng chú giải bằng matplotlib?
- 2. Matplotlib: Văn bản được mã hóa màu trong chú giải thay vì một dòng
- 3. Lô thời gian Chú thích Dòng trong Matplotlib
- 4. Matplotlib: Chú giải không được hiển thị đúng cách
- 5. Matplotlib: linewidth được thêm vào độ dài của một dòng
- 6. Chú thích chồng chéo Matplotlib
- 7. Thay đổi độ rộng của các ghi chú trong Beamer (LaTeX)
- 8. Tăng kích thước phông chữ trong chú giải quãng tám?
- 9. Bất kỳ cách nào để mở rộng dòng trong chú giải?
- 10. Làm thế nào để thiết lập chiều rộng dòng của mũ thanh lỗi, trong matplotlib?
- 11. Chế độ Emacs nhiều dòng chú thích
- 12. thao tác dòng thông tin để ấp trong matplotlib
- 13. Tăng độ phân giải đa giác của lô cực ggplot
- 14. Tăng tốc các ô phân tán matplotlib
- 15. thêm dòng dựa trên độ dốc và chặn trong matplotlib?
- 16. Chú giải công cụ nhiều dòng trong Java?
- 17. Các khóa chú giải khác nhau bên trong cùng một chú giải trong ggplot2
- 18. Làm thế nào để đặt kích thước phông chữ của chú giải trục Matplotlib?
- 19. Xóa các dòng thông qua các ký hiệu trong chú giải trong r
- 20. matplotlib: dòng mở rộng hơn 2 điểm kiểm soát
- 21. matplotlib - Chú thích trong subplot riêng biệt
- 22. làm cách nào để tạo một chú giải đơn lẻ cho nhiều trang con bằng matplotlib?
- 23. matplotlib: căn chỉnh của tiêu đề chú thích
- 24. Xóa các dòng trong chú thích fill.contour
- 25. rộng phi tuyến tính của một bản đồ màu để tăng cường độ tương phản
- 26. Độ phân giải phương pháp mở rộng
- 27. Các ký tự dòng mới trong vùng văn bản tăng độ dài văn bản trong C#
- 28. Matplotlib: Chiều ngang nằm ngang trong Chú thích
- 29. Làm thế nào để bạn làm cho độ rộng của một dòng thay đổi như một hàm của x trong matplotlib?
- 30. Căn chỉnh văn bản trong chú thích Matplotlib
đẹp, tôi đã tìm kiếm điều này trước đó. Hy vọng nó được chấp nhận ở đây;] – Alnitak
@Alnitak Tôi đã cập nhật câu trả lời này với một tùy chọn khác. – ImportanceOfBeingErnest