আইপথন নোটবুকের একটি ম্যাটপ্লোটিলিব প্লটে একটি স্বেচ্ছাসেবক লাইন যুক্ত করা


119

আমি পাইথন / ম্যাটপ্ল্লোব এবং উভয় ক্ষেত্রেই আইপিথন নোটবুকের মাধ্যমে ব্যবহার করছি। আমি বিদ্যমান গ্রাফটিতে কিছু টীকাগুলির লাইন যুক্ত করার চেষ্টা করছি এবং গ্রাফের রেখাগুলি কীভাবে রেন্ডার করব তা আমি বুঝতে পারি না। সুতরাং, উদাহরণস্বরূপ, আমি যদি নিম্নলিখিত প্লট করি:

import numpy as np
np.random.seed(5)
x = arange(1, 101)
y = 20 + 3 * x + np.random.normal(0, 60, 100)
p =  plot(x, y, "o")

আমি নিম্নলিখিত গ্রাফ পেতে:

সুন্দর ছত্রভঙ্গ প্লট

তাহলে আমি কীভাবে (70,100) থেকে (70,250) পর্যন্ত একটি উল্লম্ব রেখা যুক্ত করব? (70,100) থেকে (90,200) একটি তির্যক রেখা সম্পর্কে কী?

আমি কিছু জিনিস চেষ্টা করেছি Line2D()যার ফলে আমার পক্ষে বিভ্রান্তি ছাড়া আর কিছুই হয়নি। ইন Rআমি কেবল অংশ ব্যবহার করেন () ফাংশন রেখাংশ যোগ হবে পারে। একটি সমতুল্য আছে matplotlib?

উত্তর:


184

plotসংশ্লিষ্ট ডেটা (বিভাগগুলির সীমানা) দিয়ে কমান্ডটি খাওয়ানোর মাধ্যমে আপনি সরাসরি যে লাইনগুলি চান তা প্লট করতে পারেন :

plot([x1, x2], [y1, y2], color='k', linestyle='-', linewidth=2)

(অবশ্যই আপনি রঙ, লাইন প্রস্থ, লাইন শৈলী ইত্যাদি চয়ন করতে পারেন)

আপনার উদাহরণ থেকে:

import numpy as np
import matplotlib.pyplot as plt

np.random.seed(5)
x = np.arange(1, 101)
y = 20 + 3 * x + np.random.normal(0, 60, 100)
plt.plot(x, y, "o")


# draw vertical line from (70,100) to (70, 250)
plt.plot([70, 70], [100, 250], 'k-', lw=2)

# draw diagonal line from (70, 90) to (90, 200)
plt.plot([70, 90], [90, 200], 'k-')

plt.show()

নতুন চার্ট


দুর্দান্ত এবং সম্পূর্ণ চিত্র সহ দুর্দান্ত উত্তর! অনেক অনেক ধন্যবাদ!
জেডি লং

2
গৌণ সংশোধন, উপরের কোডটি পড়া উচিত x = np.arange(1, 101)
ডাব্লুপি ম্যাকনিল

এটি একটি লাইন আঁকবে না, তবে কেবল একটি বিভাগ। দুটি প্রদত্ত পয়েন্ট কীভাবে একটি লাইন নিক্ষেপ করবেন সে প্রশ্নটি উত্তরহীন।
অ্যালেক্সি

6
@ রুমানো আপনি "_" দিয়ে শুরু করে একটি লেবেল যুক্তি যুক্ত করে কিংবদন্তিগুলিতে অ্যাকাউন্টগুলিতে নেওয়া বিভাগগুলি এড়াতে পারবেন। plt.plot([70, 70], [100, 250], 'k-', lw=2, label="_not in legend")
উদাহরণস্বরূপ

1
সত্য যে 90উভয় হিসেবে ব্যবহার করা হয় x2এবং y1বাড়ে দ্ব্যর্থতার অনেক। যে কেউ এটি দেখার জন্য, নোট করুন যে [70, 90]অবস্থানের একক পয়েন্ট উল্লেখ করে না x1,y1। রেফারেন্সের জন্য, মানগুলির অর্থ এখানে [x1: 70, x2: 90], [y1: 90, y2: 200]
রইল

61

নতুনদের জন্য খুব বেশি দেরি হয়নি ।

plt.axvline(x, color='r')

এটি ymin এবং ymax ব্যবহার করে পাশাপাশি y এর পরিসরও নেয়।


1
Axhline এবং axvline এর সর্বনিম্ন / সর্বাধিক পরামিতিগুলি 0 এবং 1 এর মধ্যে স্কেলারের মান যা প্লটের প্রান্তের সাথে সম্পর্কিত রেখায় প্লট করে। যদিও একটি ভাল সরঞ্জাম, এটি সম্ভবত টীকীকরণের রেখাগুলি আঁকার লেখকের সমস্যা বিবরণের সেরা সমাধান নয়।
বাইনারিস্বেস্ট্রেট

3
পুরো গ্রাফটি ছড়িয়ে থাকা ব্যাকগ্রাউন্ডে একটি টীকাগুলির লাইন যুক্ত করতে চাওয়ার জন্য এটি উপযুক্ত। আমি যদি উপরে উল্লিখিত সমাধানটি x = 1 এ উল্লম্ব রেখা আঁকার জন্য ব্যবহার করি তবে আমাকে ন্যূনতম এবং সর্বাধিক y উল্লেখ করতে হবে এবং তারপরে প্লটটি স্বয়ংক্রিয়ভাবে একটি বাফারের সাথে আকার পরিবর্তন করবে, সুতরাং লাইনটি পুরো প্লট জুড়ে প্রসারিত হবে না এবং এটি একটি ঝামেলা। এটি আরও মার্জিত এবং প্লটের আকার পরিবর্তন করে না।
বনি

40

ব্যবহার vlines:

import numpy as np
np.random.seed(5)
x = arange(1, 101)
y = 20 + 3 * x + np.random.normal(0, 60, 100)
p =  plot(x, y, "o")
vlines(70,100,250)

বেসিক কল স্বাক্ষরগুলি হ'ল:

vlines(x, ymin, ymax)
hlines(y, xmin, xmax)

2
এটা দারুণ. আমি vline()বা hline()কাজগুলি দেখিনি । তির্যক রেখা সম্পর্কে কি? আপনি এখন আমাকে h & v রেখাটি দেখিয়েছেন এমনটি তির্যক বিট যুক্ত করার জন্য প্রশ্নটি সম্পাদনা করেছি।
জেডি লং

একটি তৈরির চেষ্টা করুন DataFrameX, Y স্থানাঙ্ক ধারণকারী এবং সঙ্গে তাদের ষড়যন্ত্রstyle='k-'
অস্টিন রিচার্ডসন

আপনাকে ধন্যবাদ, এটি খুব সহজ
এলেক্স

6

ওপাল যেমন খুঁজছিল ম্যাটপ্লোলিব এখন 'টীকাগুলি লাইন' করার অনুমতি দেয়। annotate()ফাংশন সংযোগ পাথ বিভিন্ন ফরম এবং হেডলেস এবং tailess তীর, অর্থাত, একটি সহজ লাইন, তাদের একজন দেয়।

ax.annotate("",
            xy=(0.2, 0.2), xycoords='data',
            xytext=(0.8, 0.8), textcoords='data',
            arrowprops=dict(arrowstyle="-",
                      connectionstyle="arc3, rad=0"),
            )

ইন ডকুমেন্টেশন আপনার প্রথম আর্গুমেন্ট হিসাবে একটি খালি স্ট্রিং একমাত্র একটি তীর আহরণ করতে পারে বলেছেন।

ওপির উদাহরণ থেকে:

%matplotlib notebook
import numpy as np
import matplotlib.pyplot as plt

np.random.seed(5)
x = np.arange(1, 101)
y = 20 + 3 * x + np.random.normal(0, 60, 100)
plt.plot(x, y, "o")


# draw vertical line from (70,100) to (70, 250)
plt.annotate("",
              xy=(70, 100), xycoords='data',
              xytext=(70, 250), textcoords='data',
              arrowprops=dict(arrowstyle="-",
                              connectionstyle="arc3,rad=0."), 
              )

# draw diagonal line from (70, 90) to (90, 200)
plt.annotate("",
              xy=(70, 90), xycoords='data',
              xytext=(90, 200), textcoords='data',
              arrowprops=dict(arrowstyle="-",
                              connectionstyle="arc3,rad=0."), 
              )

plt.show()

ইনলাইন চিত্রের উদাহরণ

যেমন gcalmettes এর উত্তর মত পদ্ধতির মত, আপনি রঙ, লাইন প্রস্থ, লাইন শৈলী, ইত্যাদি চয়ন করতে পারেন।

কোডের এমন একটি অংশে এখানে পরিবর্তন রয়েছে যা দুটি উদাহরণ লাইনের মধ্যে একটিকে লাল, প্রশস্ত এবং 100% অস্বচ্ছ নয় make

# draw vertical line from (70,100) to (70, 250)
plt.annotate("",
              xy=(70, 100), xycoords='data',
              xytext=(70, 250), textcoords='data',
              arrowprops=dict(arrowstyle="-",
                              edgecolor = "red",
                              linewidth=5,
                              alpha=0.65,
                              connectionstyle="arc3,rad=0."), 
              )

এছাড়াও আপনি সামঞ্জস্য করে সংযোগ লাইন বক্ররেখা যোগ করতে পারেন connectionstyle


1
এটাই আমার দরকার ছিল। আমি প্লটের সীমানার বাইরে গিয়ে একটি লাইন আঁকতে চেয়েছিলাম, যা .plot()করতে পারে না।
নিক এস

5

গালি দেওয়ার পরিবর্তে plotবা annotate, যা অনেক লাইনের জন্য অকার্যকর হবে, আপনি ব্যবহার করতে পারেন matplotlib.collections.LineCollection:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection

np.random.seed(5)
x = np.arange(1, 101)
y = 20 + 3 * x + np.random.normal(0, 60, 100)
plt.plot(x, y, "o")

# Takes list of lines, where each line is a sequence of coordinates
l1 = [(70, 100), (70, 250)]
l2 = [(70, 90), (90, 200)]
lc = LineCollection([l1, l2], color=["k","blue"], lw=2)

plt.gca().add_collection(lc)

plt.show()

লাইন সংগ্রহের মাধ্যমে প্লট করা দুটি লাইন সহ চিত্র

এটি রেখার একটি তালিকা নেয় [l1, l2, ...], যেখানে প্রতিটি লাইন এন স্থানাঙ্কের অনুক্রম ( এন দুটির চেয়ে বেশি হতে পারে)।

মানক বিন্যাসের কীওয়ার্ডগুলি উপলভ্য, একক মান গ্রহণ করে, এক্ষেত্রে মানটি প্রতিটি লাইনের ক্ষেত্রে প্রযোজ্য হয় বা এম এর ক্রম হয় values, সেক্ষেত্রে i তম লাইনের মানটি হয় values[i % M]

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