簡體   English   中英

如何在matplotlib圖上循環顯示顏色和線條樣式?

[英]How to cycle through both colours and linestyles on a matplotlib figure?

我有一堆圖表,每個圖表各有15到20行。 我想循環使用顏色和線條來獲得許多獨特的線條。 如果我使用6種顏色和4種線條樣式應該有20條獨特的線條,但是下面的代碼只產生6.我做錯了什么?

這是一個虛假的數據集

import matplotlib.pyplot as plt
from cycler import cycler
import numpy
import seaborn
seaborn.set_style('white')

x = range(10)
ys = []
for i in range(20):
    ys.append(numpy.random.uniform(1, 10, size=10)*i)

這是我可以從其他帖子收集的內容:

plt.rc('axes', prop_cycle=(cycler('color', ['r', 'g', 'b', 'y', 'c', 'k']) +
                           cycler('linestyle', ['-', '--', ':', '-.', '-', '--'])))

注意我在linestyle cycler中使用了重復項,否則我們會得到ValueError。

並密謀

plt.figure()
for i in range(20):
    plt.plot(x, ys[i], label=i)
plt.legend(loc=(1, 0.1))
plt.show()

在此輸入圖像描述

您可能希望將兩個循環器相乘:

plt.rc('axes', prop_cycle=(cycler('color', ['r', 'g', 'b', 'y', 'c', 'k']) *
                           cycler('linestyle', ['-', '--', ':', '-.'])))

如規定在這里 ,加入循環顏色和線型同時,而乘法混合所有屬性。

在這種情況下,您不必使用重復的線條樣式,因為顏色和線條樣式不必具有相等的循環長度。

正如@datasailor已經提到的那樣,你應該將兩個周期相乘:

cycler_op1 = cycler('color', ['r', 'g', 'b', 'y', 'c', 'k']) \
            * cycler('linestyle', ['-', '--', ':', '-.', '-', '--'])

cycler_op2 = cycler('linestyle', ['-', '--', ':', '-.', '-', '--']) \
            * cycler('color', ['r', 'g', 'b', 'y', 'c', 'k'])

rc('axes', prop_cycle = cycler_op1 ) # or cycler_op2

請注意,乘法不是可交換的,您會得到不同的結果。 基本上,在第一種情況下,顏色是固定的,線條樣式也會改變。 在第二種情況下,線條樣式是固定的,顏色會發生變化。 總共6x6 = 36種可能性。

cycler_op1

cycler_op2

如此大量的曲線,您可以嘗試更多的顏色和線條樣式。

ls_cycler = cycler('linestyle',
                    [(0,()), # solid 
                     (0, (1, 10)), # loosely dotted
                     (0, (1, 5)), # dotted
                     (0, (1, 1)), # densely dotted
                     (0, (5, 10)), # loosely dashed
                     (0, (5, 5)), # dashed
                     (0, (5, 1)), # densely dashed
                     (0, (3, 10, 1, 10)), # loosely dashdotted
                     (0, (3, 5, 1, 5)), # dashdotted
                     (0, (3, 1, 1, 1)), # densely dashdotted
                     (0, (3, 10, 1, 10, 1, 10)), # loosely dashdotdotted
                     (0, (3, 5, 1, 5, 1, 5)), # dashdotdotted
                     (0, (3, 1, 1, 1, 1, 1))] # densely dashdotdotted
                  )

color_cycler = cycler('color', [plt.get_cmap('jet')(i/13) for i in range(13)] )

new_cycler = color_cycler + ls_cycler

結果如下所示:

new_cycler

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM