একক চিত্রে বিভিন্ন প্লটের জন্য বিভিন্ন বর্ণের লাইন কীভাবে পাবেন?


202

আমি matplotlibপ্লট তৈরি করতে ব্যবহার করছি । আমাকে প্রতিটি প্লটকে আলাদা রঙের সাথে সনাক্ত করতে হবে যা পাইথন দ্বারা স্বয়ংক্রিয়ভাবে উত্পন্ন করা উচিত।

আপনি কি দয়া করে আমাকে একই চিত্রে বিভিন্ন প্লটের জন্য বিভিন্ন রঙ রাখার একটি পদ্ধতি দিতে পারেন?

উত্তর:


424

ম্যাটপ্লটলিব এটি ডিফল্টরূপে করে।

উদাহরণ:

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

প্লট ডিফল্ট রঙ সাইক্লিংয়ের উপর নিয়ন্ত্রণ দেখাচ্ছে

আপনি যদি ম্যাটপ্লটলিবের সাথে অপরিচিত হন তবে টিউটোরিয়ালটি শুরু করার জন্য ভাল জায়গা

সম্পাদনা:

প্রথমে, যদি আপনার কাছে একটি চিত্রের উপর চক্রান্ত করতে চান এমন অনেকগুলি (> 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
সর্বশেষ উদাহরণের জন্য দ্রষ্টব্য, ম্যাটপ্ল্লোলিবের নতুন সংস্করণগুলিতে, অবহেলা 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আপনার প্রয়োজন অনুসারে পরিবর্তন করা উচিত ।
Nate

1
@ জোকিংটন: ব্যাখ্যাটি দুর্দান্ত ছিল, আপনাকে অনেক ধন্যবাদ
রিকা

এটা অসাধারণ. তাদের ইন্টারেক্টিভ করার কোন উপায় আছে? উদাহরণস্বরূপ, আরআই-তে ggplot কে ggplotly () এ রূপান্তর করুন এবং প্লটটি html ইন্টারেক্টিভ হয়ে যায়
kRazzy আর

আমি দৃ convinced়ভাবে বিশ্বাস করি যে ওপি জানত যে ম্যাটপ্ল্লোলিব একক প্লটে (এককভাবে 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

টিএল; ডিআর না, এটি স্বয়ংক্রিয়ভাবে করা যায় না । হ্যা এটা সম্ভব.

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) একটি চিত্রের ( ) এর নিজস্ব চক্র রয়েছে - আপনি যদি প্রতিটি প্লটের জন্য আলাদা রঙ জোর না করেন তবে সমস্ত প্লট একই রঙের ক্রম ভাগ করে তবে আমরা যদি কিছুটা প্রসারিত করি তবে "স্বয়ংক্রিয়ভাবে" এর অর্থ কী? , এটা হতে পারে.


ওপি লিখেছেন

[...] আমাকে প্রতিটি প্লটকে আলাদা রঙের সাথে সনাক্ত করতে হবে যা [ম্যাটপ্ল্লোলিব] দ্বারা স্বয়ংক্রিয়ভাবে উত্পন্ন করা উচিত।

তবে ... ম্যাটপ্লটলিব প্রতিটি পৃথক বক্ররেখার জন্য স্বয়ংক্রিয়ভাবে বিভিন্ন রঙ উত্পন্ন করে

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]:

এখানে চিত্র বর্ণনা লিখুন

তাহলে ওপি অনুরোধ কেন? যদি আমরা পড়তে থাকি, আমাদের আছে have

আপনি কি দয়া করে আমাকে একই চিত্রে বিভিন্ন প্লটের জন্য বিভিন্ন রঙ রাখার একটি পদ্ধতি দিতে পারেন?

এবং এটি উপলব্ধি করে, কারণ প্রতিটি প্লটের ( 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))

এখানে চিত্র বর্ণনা লিখুন

যদি এটি মূল প্রশ্নের অর্থ হয় তবে একটি সম্ভাবনা হ'ল প্রতিটি প্লটের জন্য স্পষ্টভাবে আলাদা রঙের নামকরণ করা।

প্লটগুলি (যেমনটি প্রায়শই ঘটে) কোনও লুপে উত্পন্ন হলে ম্যাটপ্ল্লোব দ্বারা স্বয়ংক্রিয়ভাবে নির্বাচিত রঙটি ওভাররাইড করতে আমাদের একটি অতিরিক্ত লুপ ভেরিয়েবল থাকতে হবে।

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

আমি আগের পোস্টে প্রদত্ত সর্বশেষ লুপ উত্তরের উপর একটি সামান্য উন্নতি প্রস্তাব করতে চাই (সেই পোস্টটি সঠিক এবং এখনও গ্রহণযোগ্য হওয়া উচিত)। শেষ উদাহরণটি লেবেল করার সময় অন্তর্নিহিত অনুমানটি হ'ল Xth সময় অনুসারে রেখার সাথে plt.label(LIST)লেবেল নম্বরটি রাখে । আমি এই পদ্ধতির আগে সমস্যার মধ্যে পড়েছি। কিংবদন্তিগুলি তৈরি করতে এবং ম্যাটপ্ল্লিটবস ডকুমেন্টেশনের জন্য তাদের লেবেলগুলি কাস্টমাইজ করার প্রস্তাবিত উপায় ( http://matplotlib.org/users/legnd_guide.html#adjusting-the-order-of-legnd-item ) লেবেলগুলি যে অনুভূত হয় সঠিক প্লটগুলির সাথে আপনি কী ভাবেন বলে মনে করেন:LISTplot

...
# 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)

**: ম্যাটপ্ল্লিটিব কিংবদন্তিরা কাজ করছেন না


3
শুধু এফআইআই: আপনি প্লট করতে "লেবেল" কোয়ার্গ ব্যবহার করতে পারেন এবং তারপরে কোনও যুক্তি ছাড়াই কিংবদন্তি কল করতে পারেন।
জো কিংটন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.