Làm thế nào để chọn một màu mới cho mỗi đường được vẽ trong một hình trong matplotlib?


109

Tôi KHÔNG muốn chỉ định một màu cho mỗi đường được vẽ và để mỗi đường có một màu riêng biệt. Nhưng nếu tôi chạy:

from matplotlib import pyplot as plt
for i in range(20):
    plt.plot([0, 1], [i, i])

plt.show()

thì tôi nhận được kết quả này:

Hình ảnh của đồ thị xuất ra bởi đoạn mã trên

Nếu bạn nhìn vào hình trên, bạn có thể thấy matplotlib cố gắng chọn màu cho từng dòng khác nhau, nhưng cuối cùng nó sử dụng lại màu - mười dòng trên cùng sử dụng cùng màu với mười dòng dưới cùng. Tôi chỉ muốn ngăn nó lặp lại các màu đã dùng VÀ / HOẶC cung cấp cho nó một danh sách các màu để sử dụng.

Câu trả lời:


59

matplotlib 1.5+

Bạn có thể sử dụng axes.set_prop_cycle( ví dụ ).

matplotlib 1.0-1.4

Bạn có thể sử dụng axes.set_color_cycle( ví dụ ).

matplotlib 0.x

Bạn có thể sử dụng Axes.set_default_color_cycle.


1
Thêm thông tin về những gì tôi đang tìm kiếm ... Bạn có thể thêm thông tin về cách sử dụng bản đồ màu để tạo danh sách N màu không?
dlamotte

19
@xyld - Không để cắm câu trả lời của riêng tôi quá nhiều, nhưng có một ví dụ ở dưới cùng của câu trả lời này: stackoverflow.com/questions/4805048/... Về cơ bản bạn chỉ cần làm điều này: [colormap(i) for i in np.linspace(0, 0.9, num_plots)], nơi colormaplà một trong những colormaps trong matplotlib.pyplot.cmnumplotslà số màu sắc độc đáo mà bạn muốn. Hãy lưu ý rằng điều này có thể dẫn đến các màu sắc khó phân biệt với nhau !!
Joe Kington

4
Câu trả lời hay đấy Joe, và nó dường như trả lời câu hỏi của xyld, vì vậy tôi sẽ chỉ để nó ở phần này. Ngoài ra, cần lưu ý rằng có một số câu trả lời tốt cho câu hỏi về việc tạo ra các màu riêng biệt, chẳng hạn như stackoverflow.com/questions/470690/…
tom10,

Nó có hiệu quả với bất kỳ âm mưu nào không? Tôi đã thử set_prop_cycle trên Axes3D, sau đó tôi đã sử dụng vòng lặp for cho nhiều ô với ax.plot_wireframe (), nhưng 2 ô được tô cùng màu.
Joonho Park

112

Tôi thường sử dụng cái thứ hai trong số này:

from matplotlib.pyplot import cm
import numpy as np

#variable n below should be number of curves to plot

#version 1:

color=cm.rainbow(np.linspace(0,1,n))
for i,c in zip(range(n),color):
   plt.plot(x, y,c=c)

#or version 2:

color=iter(cm.rainbow(np.linspace(0,1,n)))
for i in range(n):
   c=next(color)
   plt.plot(x, y,c=c)

Ví dụ về 2: âm mưu ví dụ với iter, màu tiếp theo


Tôi đã sử dụng # 2. Tôi có một danh sách các kênh mà tôi cần vẽ, nhưng chúng có thể có độ dài khác nhau. Tôi thấy rằng thiết lập n = len của danh sách đó rất hữu ích để đảm bảo rằng các màu được chọn trải dài trong phạm vi và bạn có thể phân biệt được. Nếu con số đó quá cao, bạn sẽ khó nhận thấy sự khác biệt về màu sắc.
màu hoa cà,

Tôi đã sử dụng số 1, rất hữu ích khi sử dụng với liệt kê (list_name)
DevX

11

prop_cycle

color_cyclekhông được chấp nhận trong phiên bản 1.5 ủng hộ sự tổng quát hóa này: http://matplotlib.org/users/whats_new.html#added-axes-prop-cycle-key-to-rcparams

# cycler is a separate package extracted from matplotlib.
from cycler import cycler
import matplotlib.pyplot as plt

plt.rc('axes', prop_cycle=(cycler('color', ['r', 'g', 'b'])))
plt.plot([1, 2])
plt.plot([2, 3])
plt.plot([3, 4])
plt.plot([4, 5])
plt.plot([5, 6])
plt.show()

Cũng được hiển thị trong ví dụ (hiện được đặt tên xấu): http://matplotlib.org/1.5.1/examples/color/color_cycle_demo.html được đề cập tại: https://stackoverflow.com/a/4971431/895245

Thử nghiệm trong matplotlib 1.5.1.


9

Tôi không biết liệu bạn có thể tự động thay đổi màu hay không, nhưng bạn có thể khai thác vòng lặp của mình để tạo ra các màu khác nhau:

for i in range(20):
   ax1.plot(x, y, color = (0, i / 20.0, 0, 1)

Trong trường hợp này, màu sắc sẽ thay đổi từ đen đến xanh lục 100%, nhưng bạn có thể điều chỉnh nếu muốn.

Xem tài liệu về lôplotlib () và tìm đối số colortừ khóa.

Nếu bạn muốn cung cấp một danh sách các màu, chỉ cần đảm bảo rằng bạn có một danh sách đủ lớn và sau đó sử dụng chỉ mục của vòng lặp để chọn màu

colors = ['r', 'b', ...., 'w']

for i in range(20):
   ax1.plot(x, y, color = colors[i])

1
Phải, tôi muốn tránh làm những việc như thế này. Tôi đã xem xét Bản đồ màu, nhưng tôi khá bối rối về cách sử dụng chúng.
dlamotte

Giải pháp này không tạo ra một cách dễ dàng để kiểm soát một colormap
Ryszard Cetnarski

Điều này rất tốt, đặc biệt là khi set_prop_cycle bị lỗi. Tôi không biết tại sao set_prop_cycle hoặc tự động tô màu không thành công trong plot_wireframe () trong Axes3D. Nhưng đây là một loại giải pháp cơ bản / thủ công để tô màu.
Joonho Park

6

Bạn có thể sử dụng "bản đồ màu định tính" được xác định trước như sau:

from matplotlib.cm import get_cmap

name = "Accent"
cmap = get_cmap(name)  # type: matplotlib.colors.ListedColormap
colors = cmap.colors  # type: list
axes.set_prop_cycle(color=colors)

Đã thử nghiệm trên matplotlib 3.0.3. Xem https://github.com/matplotlib/matplotlib/issues/10840 để thảo luận về lý do bạn không gọi được axes.set_prop_cycle(color=cmap).

Danh sách các bản đồ màu xác định trước chất lượng có sẵn tại https://matplotlib.org/gallery/color/colormap_reference.html :

Danh sách các bản đồ màu định tính


Lưu ý rằng nó có 3 màu đầu tiên theo thứ tự trên những màu này
Ben Jones

2

Bạn cũng có thể thay đổi chu kỳ màu mặc định trong matplotlibrctệp của mình . Nếu bạn không biết tệp đó ở đâu, hãy làm như sau trong python:

import matplotlib
matplotlib.matplotlib_fname()

Điều này sẽ hiển thị cho bạn đường dẫn đến tệp matplotlibrc hiện đang sử dụng của bạn. Trong tệp đó, bạn sẽ tìm thấy trong số nhiều cài đặt khác cũng là cài đặt cho axes.color.cycle. Chỉ cần đặt chuỗi màu mong muốn của bạn và bạn sẽ tìm thấy nó trong mọi âm mưu bạn thực hiện. Lưu ý rằng bạn cũng có thể sử dụng tất cả các tên màu html hợp lệ trong matplotlib.


0

Như câu trả lời của Ciro ghi chú, bạn có thể sử dụng prop_cycleđể thiết lập danh sách các màu cho matplotlib để thay đổi. Nhưng có mấy màu? Điều gì sẽ xảy ra nếu bạn muốn sử dụng cùng một chu kỳ màu cho nhiều lô, với số lượng đường khác nhau?

Một chiến thuật sẽ là sử dụng một công thức giống như công thức từ https://gamedev.stackexchange.com/a/46469/22397 , để tạo ra một chuỗi màu vô hạn trong đó mỗi màu cố gắng khác biệt đáng kể với tất cả những màu đứng trước nó.

Thật không may, prop_cyclesẽ không chấp nhận các chuỗi vô hạn - nó sẽ treo mãi mãi nếu bạn vượt qua nó. Nhưng chúng ta có thể lấy 1000 màu đầu tiên được tạo ra từ một chuỗi như vậy và đặt nó làm chu kỳ màu. Bằng cách đó, đối với các ô có bất kỳ số dòng nào, bạn sẽ có được màu sắc dễ phân biệt.

Thí dụ:

from matplotlib import pyplot as plt
from matplotlib.colors import hsv_to_rgb
from cycler import cycler

# 1000 distinct colors:
colors = [hsv_to_rgb([(i * 0.618033988749895) % 1.0, 1, 1])
          for i in range(1000)]
plt.rc('axes', prop_cycle=(cycler('color', colors)))

for i in range(20):
    plt.plot([1, 0], [i, i])

plt.show()

Đầu ra:

Kết quả đồ thị theo đoạn mã trên

Bây giờ, tất cả các màu đều khác nhau - mặc dù tôi thừa nhận rằng tôi rất vất vả để phân biệt một vài màu trong số chúng!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.