Truy cập trình lặp chu kỳ màu
Không có phương thức "hướng tới người dùng" (hay còn gọi là "công khai") để truy cập trình vòng lặp bên dưới, nhưng bạn có thể truy cập nó thông qua các phương thức "riêng tư" (theo quy ước). Tuy nhiên, bạn không thể có được trạng thái của một iterator
mà không thay đổi nó.
Thiết lập chu kỳ màu
Nhanh chóng sang một bên: Bạn có thể đặt chu kỳ màu / thuộc tính theo nhiều cách khác nhau (ví dụ: ax.set_color_cycle
trong các phiên bản <1.5 hoặc ax.set_prop_cycler
trong> = 1.5). Hãy xem ví dụ ở đây cho phiên bản 1.5 trở lên hoặc kiểu trước đó tại đây .
Truy cập trình lặp bên dưới
Tuy nhiên, trong khi không có phương thức công khai nào để truy cập có thể lặp lại, bạn có thể truy cập nó cho một đối tượng trục đã cho ( ax
) thông qua _get_lines
cá thể lớp trợ giúp. ax._get_lines
là một liên lạc được đặt tên một cách khó hiểu, nhưng đó là cỗ máy hậu trường cho phép plot
lệnh xử lý tất cả các cách kỳ lạ và đa dạng plot
có thể được gọi. Trong số những thứ khác, đó là thứ theo dõi những màu nào để tự động gán. Tương tự, có ax._get_patches_for_fill
để kiểm soát chu kỳ thông qua các màu tô mặc định và thuộc tính vá.
Ở bất kỳ tỷ lệ nào, chu kỳ màu có thể lặp lại là ax._get_lines.color_cycle
cho các đường và ax._get_patches_for_fill.color_cycle
cho các mảng. Trên matplotlib> = 1.5, điều này đã thay đổi để sử dụng cycler
thư viện và có thể lặp lại được gọi prop_cycler
thay vì color_cycle
và mang lại một dict
thuộc tính thay vì chỉ một màu.
Nói chung, bạn sẽ làm điều gì đó như:
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
color_cycle = ax._get_lines.color_cycle
Bạn không thể xem trạng thái của một iterator
Tuy nhiên, đối tượng này là một "trần" iterator
. Chúng ta có thể dễ dàng nhận được mục tiếp theo (ví dụ next_color = next(color_cycle)
, nhưng điều đó có nghĩa là màu tiếp theo sau đó là màu sẽ được vẽ. Theo thiết kế, không có cách nào để có được trạng thái hiện tại của một trình lặp mà không thay đổi nó.
Trong v1.5
hoặc lớn hơn, sẽ rất tuyệt nếu có được cycler
đối tượng được sử dụng, vì chúng ta có thể suy ra trạng thái hiện tại của nó. Tuy nhiên, cycler
bản thân đối tượng không thể truy cập (công khai hoặc riêng tư) ở bất kỳ đâu. Thay vào đó, chỉ itertools.cycle
cá thể được tạo từ cycler
đối tượng mới có thể truy cập được. Dù bằng cách nào, không có cách nào để đi đến trạng thái cơ bản của bộ tuần hoàn màu / thuộc tính.
Thay vào đó, hãy khớp với màu của mục được vẽ trước đó
Trong trường hợp của bạn, có vẻ như bạn đang muốn kết hợp màu sắc của thứ gì đó vừa được vẽ. Thay vì cố gắng xác định màu / thuộc tính sẽ là gì, hãy đặt màu / vv của mặt hàng mới của bạn dựa trên các thuộc tính của thứ được vẽ.
Ví dụ, trong trường hợp bạn mô tả, tôi sẽ làm như sau:
import matplotlib.pyplot as plt
import numpy as np
def custom_plot(x, y, **kwargs):
ax = kwargs.pop('ax', plt.gca())
base_line, = ax.plot(x, y, **kwargs)
ax.fill_between(x, 0.9*y, 1.1*y, facecolor=base_line.get_color(), alpha=0.5)
x = np.linspace(0, 1, 10)
custom_plot(x, x)
custom_plot(x, 2*x)
custom_plot(x, -x, color='yellow', lw=3)
plt.show()
Đó không phải là cách duy nhất, nhưng nó rõ ràng hơn là cố gắng lấy màu của đường vẽ trước đó, trong trường hợp này.