एक ही आकृति में विभिन्न भूखंडों के लिए अलग-अलग रंगीन रेखाएं कैसे प्राप्त करें?


202

मैं matplotlibभूखंड बनाने के लिए उपयोग कर रहा हूं । मुझे प्रत्येक प्लॉट को एक अलग रंग के साथ पहचानना होगा जिसे पायथन द्वारा स्वचालित रूप से उत्पन्न किया जाना चाहिए।

क्या आप कृपया मुझे एक ही आकृति में विभिन्न भूखंडों के लिए अलग-अलग रंग डालने की विधि दे सकते हैं?

जवाबों:


424

Matplotlib डिफ़ॉल्ट रूप से ऐसा करता है।

उदाहरण के लिए:

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(10)

plt.plot(x, x)
plt.plot(x, 2 * x)
plt.plot(x, 3 * x)
plt.plot(x, 4 * x)
plt.show()

रंग चक्र का प्रदर्शन करने वाला मूल कथानक

और, जैसा कि आप पहले से ही जानते हैं, आप आसानी से एक किंवदंती जोड़ सकते हैं:

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(10)

plt.plot(x, x)
plt.plot(x, 2 * x)
plt.plot(x, 3 * x)
plt.plot(x, 4 * x)

plt.legend(['y = x', 'y = 2x', 'y = 3x', 'y = 4x'], loc='upper left')

plt.show()

कथा के साथ मूल कथानक

यदि आप उन रंगों को नियंत्रित करना चाहते हैं, जिन्हें चक्रित किया जाएगा:

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(10)

plt.gca().set_color_cycle(['red', 'green', 'blue', 'yellow'])

plt.plot(x, x)
plt.plot(x, 2 * x)
plt.plot(x, 3 * x)
plt.plot(x, 4 * x)

plt.legend(['y = x', 'y = 2x', 'y = 3x', 'y = 4x'], loc='upper left')

plt.show()

डिफ़ॉल्ट रंग साइकिल चलाने पर नियंत्रण दिखाने वाला प्लॉट

यदि आप matplotlib से अपरिचित हैं, तो ट्यूटोरियल शुरू करने के लिए एक अच्छी जगह है

संपादित करें:

सबसे पहले, यदि आपके पास बहुत सारी (> 5) चीजें हैं, जिन्हें आप एक आंकड़े पर प्लॉट करना चाहते हैं:

  1. उन्हें अलग-अलग भूखंडों पर रखें (एक आंकड़े पर कुछ सबप्लॉट्स का उपयोग करने पर विचार करें), या
  2. उनके बीच अंतर करने के लिए रंग (यानी मार्कर स्टाइल या लाइन मोटाई) के अलावा कुछ का उपयोग करें।

अन्यथा, आप बहुत गंदे साजिश के साथ हवा जा रहे हैं ! जो कभी भी आप जो भी कर रहे हैं उसे पढ़ने के लिए अच्छा रहें और एक आकृति पर 15 विभिन्न चीजों को रटने की कोशिश न करें !!

इसके अलावा, कई लोग डिग्री को अलग-अलग करने के लिए रंगीन होते हैं, और कई अलग-अलग रंगों के बीच अंतर करना आपके लिए अधिक लोगों के लिए मुश्किल होता है जितना आप महसूस कर सकते हैं।

कहा जा रहा है, अगर आप वास्तव में 20 अलग-अलग रंगों के साथ एक धुरी पर 20 लाइनें लगाना चाहते हैं, तो यहां एक तरीका है:

import matplotlib.pyplot as plt
import numpy as np

num_plots = 20

# Have a look at the colormaps here and decide which one you'd like:
# http://matplotlib.org/1.2.1/examples/pylab_examples/show_colormaps.html
colormap = plt.cm.gist_ncar
plt.gca().set_prop_cycle(plt.cycler('color', plt.cm.jet(np.linspace(0, 1, num_plots))))

# Plot several different functions...
x = np.arange(10)
labels = []
for i in range(1, num_plots + 1):
    plt.plot(x, i * x + 5 * i)
    labels.append(r'$y = %ix + %i$' % (i, 5*i))

# I'm basically just demonstrating several different legend options here...
plt.legend(labels, ncol=4, loc='upper center', 
           bbox_to_anchor=[0.5, 1.1], 
           columnspacing=1.0, labelspacing=0.0,
           handletextpad=0.0, handlelength=1.5,
           fancybox=True, shadow=True)

plt.show()

किसी दिए गए कॉलोरामैप के आधार पर 20 लाइनों के लिए अद्वितीय रंग


17
अंतिम उदाहरण के लिए ध्यान दें, matplotlib के नए संस्करणों में, set_color_cycleपदावनत कर दिया गया है, इसलिए यह पंक्ति होनी चाहिए plt.gca().set_prop_cycle(plt.cycler('color', plt.cm.jet(np.linspace(0, 1, num_plots))))और बस plt.cm.YOUR_PREFERED_COLOR_MAPअपनी आवश्यकताओं के अनुरूप बदलें ।
नट

1
@JoeKington: स्पष्टीकरण अद्भुत था, बहुत बहुत धन्यवाद
Rika

यह महान है। वहाँ उन्हें इंटरैक्टिव बनाने के लिए एक रास्ता है? RI में उदाहरण के लिए ggplot को ggplotly () में बदलें, और प्लॉट html इंटरैक्टिव हो जाता है
kRazzy R

मुझे विश्वास है कि ओपी जानता था कि माटप्लोटलिब रंग एक ही भूखंड में (एक एकल में axes) अलग-अलग घटता है और एक ही पंक्ति के रंग को अलग-अलग भूखंडों (अलग-अलग axes) में अलग-अलग करने के बारे में पूछते हैं ... उन्होंने कहा, एक महत्वपूर्ण उत्तर सवाल (संभवतः ओपी ने जो पूछा, उससे अलग, लेकिन कोई भी नहीं बता सकता क्योंकि उन्होंने यह एकल प्रश्न पूछा था और गायब हो गया था!) ​​- +1
gboffi

37

बाद में उन्हें सेट करना

अगर आपको प्लॉट की संख्या नहीं पता है तो आप प्लॉट करने जा रहे हैं, आप रंग बदलने के बाद एक बार प्लॉट से सीधे नंबर प्राप्त कर सकते हैं .lines, मैं इस समाधान का उपयोग करता हूं:

कुछ यादृच्छिक डेटा

import matplotlib.pyplot as plt
import numpy as np

fig1 = plt.figure()
ax1 = fig1.add_subplot(111)


for i in range(1,15):
    ax1.plot(np.array([1,5])*i,label=i)

कोड का टुकड़ा जो आपको चाहिए:

colormap = plt.cm.gist_ncar #nipy_spectral, Set1,Paired   
colors = [colormap(i) for i in np.linspace(0, 1,len(ax1.lines))]
for i,j in enumerate(ax1.lines):
    j.set_color(colors[i])
  

ax1.legend(loc=2)

परिणाम निम्नलिखित है:यहां छवि विवरण दर्ज करें


8

TL; DR नहीं, यह स्वचालित रूप से नहीं किया जा सकता । हाँ यह संभव है।

import matplotlib.pyplot as plt
my_colors = plt.rcParams['axes.prop_cycle']() # <<< note that we CALL the prop_cycle
fig, axes = plt.subplots(2,3)
for ax in axes.flatten(): ax.plot((0,1), (0,1), **next(my_colors))

यहां छवि विवरण दर्ज करें प्रत्येक प्लॉट ( axes) एक आकृति में ( figure) रंगों का अपना चक्र है - यदि आप प्रत्येक प्लॉट के लिए एक अलग रंग को बाध्य नहीं करते हैं, तो सभी प्लॉट रंगों के समान क्रम को साझा करते हैं लेकिन, अगर हम थोड़ा सा खींचते हैं तो "स्वचालित रूप से" का अर्थ है , यह किया जा सकता है।


ओपी ने लिखा

[...] मुझे प्रत्येक प्लॉट को एक अलग रंग के साथ पहचानना होगा जिसे स्वचालित रूप से [Matplotlib] द्वारा उत्पन्न किया जाना चाहिए।

लेकिन ... Matplotlib स्वचालित रूप से प्रत्येक अलग वक्र के लिए अलग-अलग रंग उत्पन्न करता है

In [10]: import numpy as np
    ...: import matplotlib.pyplot as plt

In [11]: plt.plot((0,1), (0,1), (1,2), (1,0));
Out[11]:

यहां छवि विवरण दर्ज करें

तो ओपी ने निवेदन क्यों किया? यदि हम पढ़ना जारी रखते हैं, तो हमारे पास है

क्या आप कृपया मुझे एक ही आकृति में विभिन्न भूखंडों के लिए अलग-अलग रंग डालने की विधि दे सकते हैं?

और यह समझ में आता है, क्योंकि प्रत्येक कथानक ( axesमाटप्लोटलिब के प्रतिमान में प्रत्येक ) का अपना color_cycle(या बल्कि, 2018 में, उसका prop_cycle) और प्रत्येक कथानक ( axes) एक ही क्रम में समान रंगों का पुन: उपयोग करता है।

In [12]: fig, axes = plt.subplots(2,3)

In [13]: for ax in axes.flatten():
    ...:     ax.plot((0,1), (0,1))

यहां छवि विवरण दर्ज करें

यदि यह मूल प्रश्न का अर्थ है, तो एक संभावना स्पष्ट रूप से प्रत्येक भूखंड के लिए एक अलग रंग का नाम है।

यदि प्लॉट्स (जैसा कि अक्सर होता है) एक लूप में उत्पन्न होता है, तो हमारे पास Matplotlib द्वारा चुने गए रंग को स्वचालित रूप से ओवरराइड करने के लिए एक अतिरिक्त लूप वेरिएबल होना चाहिए ।

In [14]: fig, axes = plt.subplots(2,3)

In [15]: for ax, short_color_name in zip(axes.flatten(), 'brgkyc'):
    ...:     ax.plot((0,1), (0,1), short_color_name)

यहां छवि विवरण दर्ज करें

एक और संभावना है कि एक साइक्लर ऑब्जेक्ट को त्वरित किया जाए

from cycler import cycler
my_cycler = cycler('color', ['k', 'r']) * cycler('linewidth', [1., 1.5, 2.])
actual_cycler = my_cycler()

fig, axes = plt.subplots(2,3)
for ax in axes.flat:
    ax.plot((0,1), (0,1), **next(actual_cycler))

यहां छवि विवरण दर्ज करें

ध्यान दें कि type(my_cycler)है, cycler.Cyclerलेकिन type(actual_cycler)है itertools.cycle


3

मैं पिछले पोस्ट में दिए गए अंतिम लूप उत्तर पर एक मामूली सुधार की पेशकश करना चाहूंगा (यह पोस्ट सही है और अभी भी स्वीकार किया जाना चाहिए)। अंतिम उदाहरण को लेबल करते समय की गई अंतर्निहित धारणा यह है कि plt.label(LIST)लेबल नंबर X LISTको Xth समय के अनुरूप लाइन के साथ रखा plotजाता है। मैं पहले इस दृष्टिकोण के साथ समस्याओं में चला गया। किंवदंतियों का निर्माण करने और matplotlibs प्रलेखन ( http://matplotlib.org/users/legend_guide.html#adjusting-the-order-of-legend-item ) के अनुसार उनके लेबल को अनुकूलित करने का अनुशंसित तरीका यह है कि लेबल जाएं। सटीक भूखंडों के साथ आपको लगता है कि वे करते हैं:

...
# Plot several different functions...
labels = []
plotHandles = []
for i in range(1, num_plots + 1):
    x, = plt.plot(some x vector, some y vector) #need the ',' per ** below
    plotHandles.append(x)
    labels.append(some label)
plt.legend(plotHandles, labels, 'upper left',ncol=1)

**: Matplotlib महापुरूष काम नहीं कर रहा


3
बस फ़िजी: आप "लेबल" क्वार्ग का उपयोग साजिश करने के लिए भी कर सकते हैं और फिर बिना किसी तर्क के किंवदंती को बुला सकते हैं।
जो किंग्सटन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.