ম্যাটপ্লোটিলেবে এক্স বা y অক্ষের উপর "টিক ফ্রিকোয়েন্সি" পরিবর্তন করছেন?


477

অজগর কীভাবে আমার ডেটা প্লট করে তা স্থির করার চেষ্টা করছি।

বলুন

x = [0,5,9,10,15]

এবং

y = [0,1,2,3,4]

তারপরে আমি করতাম:

matplotlib.pyplot.plot(x,y)
matplotlib.pyplot.show()

এবং এক্স অক্ষের টিকগুলি 5 এর বিরতিতে প্লট করা হয় এটি 1 এর অন্তর দেখানোর উপায় আছে কি?


6
যদিও টিক্স এখানে উপযুক্ত শব্দ, তবে টিকগুলি ধাপের আকারে পরিবর্তনগুলি অবশ্যই এই প্রশ্নের আরও নবাগতদের গাইড করবে।
সিবস জুয়া

9
ঘনিষ্ঠভাবে সম্পর্কিত প্রশ্ন: স্ট্যাকওভারফ্লো / প্রশ্নগুলি / 68682২78৮৪/২ এবং একটি দুর্দান্ত সমাধান:pyplot.locator_params(nbins=4)
ডঃ জানু-ফিলিপ গেহর্ক্ক

দুর্ভাগ্যক্রমে
nbins matplotlib2.x এ অবমানিত

উত্তর:


583

আপনি যেখানে স্পষ্টভাবে সেট করতে পারেন যেখানে আপনি চিহ্নগুলি টিক করতে চান plt.xticks:

plt.xticks(np.arange(min(x), max(x)+1, 1.0))

উদাহরণ স্বরূপ,

import numpy as np
import matplotlib.pyplot as plt

x = [0,5,9,10,15]
y = [0,1,2,3,4]
plt.plot(x,y)
plt.xticks(np.arange(min(x), max(x)+1, 1.0))
plt.show()

( np.arangeপাইথনের rangeফাংশন না দিয়ে ব্যবহৃত হয়েছিল কেবল ক্ষেত্রে min(x)এবং max(x)এটি ইনটসের পরিবর্তে ভাসমান))


plt.plot(অথবা ax.plot) ফাংশন স্বয়ংক্রিয়ভাবে ডিফল্ট সেট হবে xএবং yসীমা। আপনি যদি এই সীমাগুলি বজায় রাখতে চান এবং কেবল টিক চিহ্নের স্টেপসাইজ পরিবর্তন করতে চান তবে ax.get_xlim()ম্যাটপ্লটলিব ইতিমধ্যে কোন সীমাবদ্ধতা নির্ধারণ করেছে তা আবিষ্কার করতে আপনি ব্যবহার করতে পারেন ।

start, end = ax.get_xlim()
ax.xaxis.set_ticks(np.arange(start, end, stepsize))

ডিফল্ট টিক ফর্ম্যাটরটিতে একটি টেক মানগুলি উল্লেখযোগ্য সংখ্যার বোধগম্যতার সাথে গোল করে একটি শালীন কাজ করা উচিত। তবে আপনি যদি ফর্ম্যাটের উপর আরও নিয়ন্ত্রণ রাখতে চান তবে আপনি নিজের ফর্ম্যাটরটি সংজ্ঞায়িত করতে পারেন। উদাহরণ স্বরূপ,

ax.xaxis.set_major_formatter(ticker.FormatStrFormatter('%0.1f'))

এখানে একটি চলমান উদাহরণ:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker

x = [0,5,9,10,15]
y = [0,1,2,3,4]
fig, ax = plt.subplots()
ax.plot(x,y)
start, end = ax.get_xlim()
ax.xaxis.set_ticks(np.arange(start, end, 0.712123))
ax.xaxis.set_major_formatter(ticker.FormatStrFormatter('%0.1f'))
plt.show()

72
এটির নিজের সীমাটি এখনও স্থির করার কোনও উপায় নেই, তবে কেবলমাত্র পদক্ষেপের আকারটি পরিবর্তন করুন? মিনিটটি 3523.232512 এর মতো কিছু হলে এই পদ্ধতিটি খুব ভাল নয়!
কোরোন

3
@ করোন, আপনার জিজ্ঞাসা করার পরে অনেকক্ষণ হয়ে গেছে, তবে আমি নীচে একটি উত্তর পোস্ট করেছি যা স্বয়ংক্রিয় সীমা নির্ধারণের জন্য এখনও পদক্ষেপের আকার নিয়ন্ত্রণের সহজতর সুযোগ দেয় allows
jthomas

3
লক্ষ্য করুন +1যে plt.xticks(np.arange(min(x), max(x)+1, 1.0))গত টিক চিহ্ন দেখানোর জন্য প্রয়োজন হয়।
অ্যালেক্স উইলিসন

1
হ্যাঁ, np.arange(start, stop)মান উত্পন্ন অর্ধ খোলা বিরতি [start, stop)সহ startকিন্তু ব্যতীত stop। সুতরাং আমি এটি অন্তর্ভুক্ত করা max(x)+1হয়েছে তা নিশ্চিত করার জন্য ব্যবহৃত max(x)
unutbu

4
ডেটটাইম উদাহরণস্বরূপ সমতুল্য কি আছে plt.xticks(np.arange(min(dates), max(dates)+0.1,0.1)? এটি কেবল বছরের প্লট বলে মনে হচ্ছে
ডাব্লুবিএম

207

আর একটি পদ্ধতির অক্ষটি লোকেটার সেট করা:

import matplotlib.ticker as plticker

loc = plticker.MultipleLocator(base=1.0) # this locator puts ticks at regular intervals
ax.xaxis.set_major_locator(loc)

আপনার প্রয়োজনের উপর নির্ভর করে বিভিন্ন ধরণের লোকেটার রয়েছে।

এখানে একটি সম্পূর্ণ উদাহরণ:

import matplotlib.pyplot as plt
import matplotlib.ticker as plticker

x = [0,5,9,10,15]
y = [0,1,2,3,4]
fig, ax = plt.subplots()
ax.plot(x,y)
loc = plticker.MultipleLocator(base=1.0) # this locator puts ticks at regular intervals
ax.xaxis.set_major_locator(loc)
plt.show()

7
এটি প্রত্যাশার মতো কাজ করে না। বিশেষত, তারিখগুলি ব্যবহার করার সময়, এটি উপযুক্ত তারিখগুলি ব্যবহার করে না।
ক্রিস ফোনেসবেক

35
তারিখগুলি ব্যবহার করার সময়, আপনার matplotlib.dates মডিউলটিতে পদ্ধতিগুলি ব্যবহার করা উচিত। উদাহরণস্বরূপmatplotlib.dates.AutoDateLocator()
রোবচ্যাট

3
এটি আমার জন্য প্রত্যাশার সাথে তারিখ সহ কাজ করেছিল। এই সমাধানটি গ্রহণযোগ্যটির চেয়ে অনেক সহজ।
পাবলো সুউ

কী base=1.0আসলে বলতে চাচ্ছি / না?
জাভাদবা

বেস = 1.0 এর অর্থ প্রতিটি সংখ্যার জন্য একটি লোকেটার থাকবে। ডকুমেন্টেশনটিতে বলা হয়েছে যে মাল্টিপলকোটর "ভিউ ব্যবধানের মধ্যে বেসের প্রতিটি পূর্ণসংখ্যার একাধিক টিক সেট করে" " সুতরাং যদি বেস = 2 তবে এমনকি সংখ্যার জন্য একটি টিক থাকবে এবং আমি মনে করি আপনি ইভেন্টটি বেস = 2.5 স্থাপন করতে পারেন।
রোবচ্যাট

124

আমি এই সমাধানটি পছন্দ করি ( ম্যাটপ্লোটলিব প্লটটিং কুকবুক থেকে ):

import matplotlib.pyplot as plt
import matplotlib.ticker as ticker

x = [0,5,9,10,15]
y = [0,1,2,3,4]

tick_spacing = 1

fig, ax = plt.subplots(1,1)
ax.plot(x,y)
ax.xaxis.set_major_locator(ticker.MultipleLocator(tick_spacing))
plt.show()

এই সমাধানটি আপনাকে প্রদত্ত সংখ্যার মাধ্যমে টিক স্পেসিংয়ের সুস্পষ্ট নিয়ন্ত্রণ ticker.MultipleLocater()দেয়, স্বয়ংক্রিয় সীমা নির্ধারণের অনুমতি দেয় এবং পরে পড়তে সহজ।


3
স্পষ্টভাবে টিক্স গণনা না করে এটি করার একটি উপায়!
জেলফির কালটস্টল

4
এটি এই উত্তর হিসাবে একই । দু'বছর পরে অভিন্ন উত্তর যুক্ত করার কোনও অর্থ হয় না।
ImportanceOfBeingEnnest

6
ভালো বল ধরা. আমি উত্তর পোস্ট করার সময় তাদেরকে একই হিসাবে চিনতে পারি নি। তবুও, আমি মনে করি এই উপস্থাপনাটি বুঝতে একটু সহজ।
jthomas

এই উত্তরের বইয়ের উল্লেখটি আরও তথ্যের জন্য সহায়ক উত্স সরবরাহ করে।
স্টিভেন সি হাওল

1
এটি তিন বছর আগে আসা রোবচটের মতো একই উত্তর।
মেরোস

90

যদি কেউ সাধারণ ওয়ান-লাইনারে আগ্রহী হয় তবে কেবল বর্তমান টিক্স পান এবং প্রতিটি টিকের নমুনা রেখে নতুন টিক্স সেট করতে এটি ব্যবহার করুন।

ax.set_xticks(ax.get_xticks()[::2])

3
এটি বিভিন্ন টিক টাইপের (
স্ট্র্যাট

2
অ-পূর্ণসংখ্যার ax.set_xticks([tick for tick in ax.get_xticks() if tick % 1 == 0])
টিক্সগুলি

উপরের প্রচুর বিশদ সমাধান তবে আমি সম্মত হলাম এটি সবচেয়ে সংক্ষিপ্ত। আপনি ax.get_xticks () এর দৈর্ঘ্যও বের করতে এবং প্রয়োজনীয় টিকের সংখ্যার দ্বারা বিভক্ত এই দৈর্ঘ্যের দ্বারা স্লাইসিং ফ্রিকোয়েন্সি সেট করতে পারেন।
আইয়েন ডি

আমি মনে করি এটিই সেরা উত্তর। বেশিরভাগ উত্তর উত্তর জটিল এবং প্রয়োগ / সাধারণীকরণের পক্ষে শক্ত। ধন্যবাদ!
সয়ানকালা

2
এটি কেবল লাঠির সংখ্যা হ্রাস করতে পারে, যদিও প্রশ্নটিতে (এবং আমার লক্ষ্য কীভাবে আমি এটি পেয়েছি) এটি বাড়ানো হয়েছিল।
আলেক্সি মার্টিয়ানভ

36

এটি কিছুটা হ্যাকি, তবে এতদূর পরিষ্কার / সহজতম উদাহরণটি বুঝতে পেরেছি যে আমি এটি করতে পেরেছি। এটি এখানে এসও এর একটি উত্তর থেকে:

ম্যাটপ্ল্লোব কালারবারে প্রতিটি নবম টিক লেবেলটি গোপন করার সবচেয়ে সহজ উপায়?

for label in ax.get_xticklabels()[::2]:
    label.set_visible(False)

তারপরে আপনি যে লেবেলগুলি দেখতে চান তা স্থির করে রাখুন বা আপনি যে ঘনত্ব চান তার উপর নির্ভর করে লুপ করতে পারেন।

সম্পাদনা করুন: নোট করুন যে কখনও কখনও ম্যাটপ্লটলিব লেবেলগুলি == সেট করে '', তাই এটি দেখতে লেবেলটির মতো উপস্থিত হতে পারে না, যখন বাস্তবে এটি থাকে এবং কিছু প্রদর্শন না করে। আপনি প্রকৃত দৃশ্যমান লেবেলের মাধ্যমে লুপ করছেন তা নিশ্চিত করার জন্য, আপনি চেষ্টা করতে পারেন:

visible_labels = [lab for lab in ax.get_xticklabels() if lab.get_visible() is True and lab.get_text() != '']
plt.setp(visible_labels[::2], visible=False)

3
এটি সবচেয়ে সহজ এবং জেনেরিক সমাধান। একটি ছোট সামঞ্জস্য: সাধারণত ax.get_xticklabels()[1::2]লুকানো থাকা লেবেলগুলি।
jolvi

এটি matplotlib.finance.candlestick2
বিসিআর

@ বিসিআর এটি হতে পারে যে কয়েকটি অষ্টিক্লাবলগুলি সবেমাত্র সেট করা আছে ''যাতে আপনি যখন সেগুলি লুপ করবেন তখন আপনি খালি অদৃশ্য অষ্টিক্লাবলগুলি তৈরি করছেন (যা ভিজ্যুয়ালাইজেশনে কোনও প্রভাব ফেলবে না, তবে এর অর্থ হতে পারে যে আপনি টানছেন না) সঠিক লেবেল)। আপনি চেষ্টা করতে পারেন: vis_labels = [label for label in ax.get_xticklabels() if label.get_visible() is True]; plt.setp(vis_labels[::2], visible==False)
চৌদ্দগ্রাফ

15

এটি একটি পুরানো বিষয়, তবে আমি এখন থেকে এবং পরে এই সময়ে হোঁচট খাচ্ছি এবং এই ফাংশনটি তৈরি করেছি। এটি খুব সুবিধাজনক:

import matplotlib.pyplot as pp
import numpy as np

def resadjust(ax, xres=None, yres=None):
    """
    Send in an axis and I fix the resolution as desired.
    """

    if xres:
        start, stop = ax.get_xlim()
        ticks = np.arange(start, stop + xres, xres)
        ax.set_xticks(ticks)
    if yres:
        start, stop = ax.get_ylim()
        ticks = np.arange(start, stop + yres, yres)
        ax.set_yticks(ticks)

এটির মতো টিকগুলি নিয়ন্ত্রণ করার একটি সাবধানতা হ'ল যে কোনও অতিরিক্ত সংযুক্ত লাইনের পরে সর্বোচ্চ স্কেলের ইন্টারেক্টিভ অটোমাজিক আপডেট উপভোগ করতে পারে না। তাহলে কর

gca().set_ylim(top=new_top) # for example

এবং আবার পুনরায় সমন্বয় ফাংশন চালান।


11

আমি একটি অবহেলা সমাধান বিকাশ। আমাদের এক্স অক্ষ রয়েছে এবং এক্স এর প্রতিটি পয়েন্টের জন্য লেবেলের একটি তালিকা রয়েছে তা বিবেচনা করুন

উদাহরণ:
import matplotlib.pyplot as plt

x = [0,1,2,3,4,5]
y = [10,20,15,18,7,19]
xlabels = ['jan','feb','mar','apr','may','jun']
ধরা যাক যে আমি কেবল 'ফেব' এবং 'জুন' এর জন্য টিক্স লেবেলগুলি দেখাতে চাই
xlabelsnew = []
for i in xlabels:
    if i not in ['feb','jun']:
        i = ' '
        xlabelsnew.append(i)
    else:
        xlabelsnew.append(i)
ভাল, এখন আমাদের কাছে লেবেলের একটি জাল তালিকা রয়েছে। প্রথমত, আমরা মূল সংস্করণ প্লট করেছি।
plt.plot(x,y)
plt.xticks(range(0,len(x)),xlabels,rotation=45)
plt.show()
এখন, পরিবর্তিত সংস্করণ।
plt.plot(x,y)
plt.xticks(range(0,len(x)),xlabelsnew,rotation=45)
plt.show()

6

যদি আপনি কেবল ন্যূনতম বয়লারপ্লেট সহ ফাঁকে ফাঁকে একটি সহজ একটি লাইনার সেট করতে চান:

plt.gca().xaxis.set_major_locator(plt.MultipleLocator(1))

গৌণ টিক্সের জন্য সহজেই কাজ করে:

plt.gca().xaxis.set_minor_locator(plt.MultipleLocator(1))

কিছুটা মাউথফুল, তবে বেশ কমপ্যাক্ট


2
xmarks=[i for i in range(1,length+1,1)]

plt.xticks(xmarks)

এটি আমার পক্ষে কাজ করেছে

আপনি যদি [1,5] (1 এবং 5 অন্তর্ভুক্ত) এর মধ্যে টিকগুলি চান তবে প্রতিস্থাপন করুন

length = 5

1
fyi, আপনি সহজভাবে লিখতে পারে xmarks = range(1, length+1, 1)। তালিকা বোধগম্য অপ্রয়োজনীয় বেশ নিশ্চিত।
নিল

2

খাঁটি পাইথন বাস্তবায়ন

নীচে কাঙ্ক্ষিত কার্যকারিতাটির বিশুদ্ধ অজগর বাস্তবায়ন যা কোনও সংখ্যক সিরিজকে ইতিবাচক, নেতিবাচক বা মিশ্র মান সহ পরিচালনা করে এবং ব্যবহারকারীকে পছন্দসই পদক্ষেপের আকার নির্দিষ্ট করতে দেয়:

import math

def computeTicks (x, step = 5):
    """
    Computes domain with given step encompassing series x
    @ params
    x    - Required - A list-like object of integers or floats
    step - Optional - Tick frequency
    """
    xMax, xMin = math.ceil(max(x)), math.floor(min(x))
    dMax, dMin = xMax + abs((xMax % step) - step) + (step if (xMax % step != 0) else 0), xMin - abs((xMin % step))
    return range(dMin, dMax, step)

নমুনা আউটপুট

# Negative to Positive
series = [-2, 18, 24, 29, 43]
print(list(computeTicks(series)))

[-5, 0, 5, 10, 15, 20, 25, 30, 35, 40, 45]

# Negative to 0
series = [-30, -14, -10, -9, -3, 0]
print(list(computeTicks(series)))

[-30, -25, -20, -15, -10, -5, 0]

# 0 to Positive
series = [19, 23, 24, 27]
print(list(computeTicks(series)))

[15, 20, 25, 30]

# Floats
series = [1.8, 12.0, 21.2]
print(list(computeTicks(series)))

[0, 5, 10, 15, 20, 25]

# Step – 100
series = [118.3, 293.2, 768.1]
print(list(computeTicks(series, step = 100)))

[100, 200, 300, 400, 500, 600, 700, 800]

নমুনা ব্যবহার

import matplotlib.pyplot as plt

x = [0,5,9,10,15]
y = [0,1,2,3,4]
plt.plot(x,y)
plt.xticks(computeTicks(x))
plt.show()

নমুনা ব্যবহারের প্লট

লক্ষ্য করুন যে x- অক্ষের পূর্ণসংখ্যার মানগুলি 5 দ্বারা সমানভাবে ব্যবধানযুক্ত, যখন y- অক্ষের আলাদা ব্যবধান থাকে ( matplotlibডিফল্ট আচরণ, কারণ টিকগুলি নির্দিষ্ট করা হয়নি)।

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