Matplotlib में एक आकृति के भीतर प्रत्येक प्लॉटेड लाइन के लिए एक नया रंग कैसे चुनें?


109

मैं प्रत्येक प्लॉट की गई लाइन के लिए एक रंग निर्दिष्ट नहीं करना चाहता, और प्रत्येक लाइन को एक अलग रंग मिलता है। लेकिन अगर मैं चला:

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

plt.show()

तब मुझे यह आउटपुट मिलता है:

ऊपर दिए गए कोड द्वारा ग्राफ आउटपुट की छवि

यदि आप ऊपर की छवि को देखते हैं, तो आप देख सकते हैं कि matplotlib प्रत्येक पंक्ति के लिए रंग लेने का प्रयास करता है जो अलग-अलग होते हैं, लेकिन अंततः यह रंगों का फिर से उपयोग करता है - शीर्ष दस लाइनें नीचे के रंगों के समान रंगों का उपयोग करती हैं। मैं इसे पहले से इस्तेमाल किए गए रंगों को दोहराने से रोकना चाहता हूं और / या इसे उपयोग करने के लिए रंगों की एक सूची फ़ीड करता हूं।

जवाबों:


59

matplotlib 1.5+

आप axes.set_prop_cycle( उदाहरण ) का उपयोग कर सकते हैं ।

matplotlib 1.0-1.4

आप axes.set_color_cycle( उदाहरण ) का उपयोग कर सकते हैं ।

matplotlib 0.x

आप उपयोग कर सकते हैं Axes.set_default_color_cycle


1
मैं क्या देख रहा था की तर्ज के साथ ... किसी भी मौका आप एन रंग की सूची उत्पन्न करने के लिए एक colormap का उपयोग करने के बारे में जानकारी जोड़ सकते हैं?
dlamotte

19
@xyld - नहीं मेरे अपने जवाब बहुत ज्यादा प्लग करने के लिए, लेकिन वहाँ इस उत्तर के तल पर एक उदाहरण है: stackoverflow.com/questions/4805048/... मूल रूप से आप सिर्फ ऐसा करते हैं: [colormap(i) for i in np.linspace(0, 0.9, num_plots)], जहां colormapमें colormaps में से एक है matplotlib.pyplot.cmऔर numplotsसंख्या है अद्वितीय रंग जो आप चाहते हैं। खबरदार कि यह रंग है कि एक दूसरे से अलग करने के लिए कठिन हैं, हालांकि में परिणाम कर सकते हैं !!
जो किंगटन

4
अच्छा जवाब जो, और यह xyld के सवाल का जवाब लगता है, इसलिए मैं इसे इस पर छोड़ दूंगा। इसके अलावा, हालांकि, यह ध्यान देने योग्य है कि अलग-अलग रंगों के निर्माण पर सवाल करने के लिए कुछ अच्छे उत्तर हैं, जैसे कि stackoverflow.com/questions/470690/…
tom10

क्या यह किसी भी साजिश के लिए काम करता है? मैंने Axes3D पर set_prop_cycle की कोशिश की है, फिर मैंने ax.plot_wireframe () के साथ कई भूखंडों के लिए लूप का उपयोग किया, लेकिन 2 भूखंड एक ही रंग के साथ रंगे हैं।
जोन्हो पार्क

112

मैं आमतौर पर इनमें से दूसरे का उपयोग करता हूं:

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)

2 का उदाहरण: उदाहरण के साथ साजिश, अगले रंग


मैंने # 2 का इस्तेमाल किया। मेरे पास उन चैनलों की एक सूची है जिन्हें मुझे प्लॉट करने की आवश्यकता है, लेकिन वे अलग-अलग लंबाई के हो सकते हैं। मैंने पाया कि उस सूची का n = लेन स्थापित करना यह सुनिश्चित करने के लिए बहुत मददगार था कि रंगों ने सीमा को चुना और आप अंतर बता सकते हैं। यदि यह संख्या बहुत अधिक है, तो रंगों में अंतर देखना कठिन है।
माउव

मैंने # 1 का उपयोग किया, यह एन्यूमरेट (सूची_नाम) के साथ उपयोग करने के लिए उपयोगी था
9X

11

prop_cycle

color_cycleइस सामान्यीकरण के पक्ष में 1.5 में पदावनत किया गया: 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()

में भी दिखाया गया है (अब बुरी तरह से नामित) उदाहरण: http://matplotlib.org/1.5.1/examples/color/color_cycle_demo.html में उल्लेख किया गया: https://stackoverflow.com/a/4971431-895245

Matplotlib में परीक्षण 1.5.1।


9

मुझे नहीं पता कि क्या आप स्वचालित रूप से रंग बदल सकते हैं, लेकिन आप विभिन्न रंगों को उत्पन्न करने के लिए अपने पाश का दोहन कर सकते हैं:

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

इस मामले में, रंग काले से 100% हरे रंग में भिन्न होंगे, लेकिन आप चाहें तो इसे ट्यून कर सकते हैं।

देखें matplotlib साजिश () डॉक्स और के लिए देखो colorकीवर्ड तर्क।

यदि आप रंगों की एक सूची खिलाना चाहते हैं, तो सुनिश्चित करें कि आपके पास एक सूची काफी बड़ी है और फिर रंग चुनने के लिए लूप के सूचकांक का उपयोग करें

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

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

1
हाँ, मैं इस तरह का कुछ करने से बचना चाहता था। मैंने कलर मैप्स में देखा, लेकिन मैं बहुत उलझन में हूं कि उनका उपयोग कैसे किया जाए।
dlamotte

यह समाधान एक
कोलोरम

यह बहुत अच्छा है, खासकर जब set_prop_cycle विफल हो जाता है। मैं नहीं जानता कि क्यों set_prop_cycle या स्वचालित रंग Axes3D में plot_wireframe () में विफल रहता है। लेकिन यह रंग भरने के लिए एक तरह का बुनियादी / मैनुअल समाधान है।
जूनो पार्क जू

6

आप इस तरह एक पूर्वनिर्धारित "गुणात्मक कॉलोर्मैप" का उपयोग कर सकते हैं:

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)

Matplotlib 3.0.3 पर परीक्षण किया गया। आप कॉल क्यों नहीं कर सकते, इस पर चर्चा के लिए https://github.com/matplotlib/matplotlib/issues/10840 देखें axes.set_prop_cycle(color=cmap)

पूर्वनिर्धारित गुणात्मक कॉलमैप की एक सूची https://matplotlib.org/gallery/color/colormap_reference.html पर उपलब्ध है :

गुणात्मक colormaps की सूची


ध्यान दें कि यह इन पर अनुक्रम में पहले 3 रंगों को लेता है
बेन जोन्स

2

आप अपनी matplotlibrcफ़ाइल में डिफ़ॉल्ट रंग चक्र भी बदल सकते हैं । यदि आप नहीं जानते कि वह फ़ाइल कहां है, तो अजगर में निम्न कार्य करें:

import matplotlib
matplotlib.matplotlib_fname()

यह आपको आपकी वर्तमान में उपयोग की गई matplotlibrc फ़ाइल का पथ दिखाएगा। उस फ़ाइल में आपको कई अन्य सेटिंग्स भी मिलेंगी axes.color.cycle। बस रंगों के अपने वांछित अनुक्रम में डाल दिया और आप इसे आपके द्वारा किए गए हर साजिश में पाएंगे। ध्यान दें कि आप matplotlib में सभी मान्य html रंग नामों का भी उपयोग कर सकते हैं।


0

के रूप में सिरो का जवाब नोट्स, आप उपयोग कर सकते हैं prop_cycleके माध्यम से चक्र के matplotlib के लिए रंग की एक सूची सेट करने। लेकिन कितने रंग? क्या होगा यदि आप बहुत से भूखंडों के लिए एक ही रंग चक्र का उपयोग करना चाहते हैं, विभिन्न लाइनों के साथ?

एक रणनीति रंगों की एक अनंत अनुक्रम उत्पन्न करने के लिए https://gamedev.stackexchange.com/a/46469/22397 से एक सूत्र का उपयोग करना होगा , जहां प्रत्येक रंग उन सभी से अलग होने की कोशिश करता है जो इसे पसंद करते हैं।

दुर्भाग्य से, prop_cycleअनंत दृश्यों को स्वीकार नहीं करेगा - यदि आप इसे पास करते हैं तो यह हमेशा के लिए लटका रहेगा। लेकिन हम कह सकते हैं, इस तरह के अनुक्रम से उत्पन्न पहले 1000 रंग, और इसे रंग चक्र के रूप में सेट करें। इस तरह, लाइनों के किसी भी संख्या के साथ भूखंडों के लिए, आपको अलग-अलग रंग मिलना चाहिए।

उदाहरण:

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()

आउटपुट:

ऊपर दिए गए कोड द्वारा ग्राफ आउटपुट

अब, सभी रंग अलग हैं - हालांकि मैं मानता हूं कि मैं उनमें से कुछ को अलग करने के लिए संघर्ष करता हूं!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.