Matplotlib में x या 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
हालांकि टिक्स यहां उपयुक्त शब्द है, लेकिन टिक्स को स्टेप साइज में बदलें निश्चित रूप से इस प्रश्न के लिए और अधिक नॉबी गाइड होंगे।
Sibbs जुआ

9
बारीकी से संबंधित प्रश्न: stackoverflow.com/questions/6682784/… और एक महान समाधान:pyplot.locator_params(nbins=4)
डॉ। जन-फिलिप गेहरके

nbins को matplotlib2.x में पदावनत किया गया लगता है, दुर्भाग्य से
jeremy_rutman

जवाबों:


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
@ कोरोन, आपके पूछे जाने के बाद से यह एक समय हो गया है, लेकिन मैंने नीचे एक उत्तर पोस्ट किया है जो स्वत: सीमा निर्धारण का उपयोग करते हुए भी कदम के आकार के आसान नियंत्रण की अनुमति देता है।
जोथमस

3
ध्यान दें कि अंतिम टिक मार्क दिखाने के लिए +1अंदर plt.xticks(np.arange(min(x), max(x)+1, 1.0))की आवश्यकता है।
एलेक्स विलिसन

1
हां, आधे-खुले अंतराल np.arange(start, stop)में मान उत्पन्न करता है , जिसमें शामिल है, लेकिन बाहर करना । इसलिए मैं यह सुनिश्चित करता था कि इसमें शामिल है। [start, stop)startstopmax(x)+1max(x)
अनटुब

4
क्या डेटाइम टाइम के लिए कोई समकक्ष है plt.xticks(np.arange(min(dates), max(dates)+0.1,0.1)? यह वर्ष में केवल प्लॉट लगता है
WBM

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

मुझे यह समाधान पसंद है ( Matplotlib प्लॉटिंग कुकबुक से ):

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
यह रूप में एक ही जवाब है इस एक । दो साल बाद एक समान उत्तर जोड़ने का कोई मतलब नहीं है।
ImportanceOfBeingErnest

6
अच्छी पकड़। जब मैंने जवाब पोस्ट किया तो मैं उन्हें वैसा नहीं पहचान पाया। फिर भी, मुझे लगता है कि यह प्रस्तुति समझने में थोड़ी आसान है।
15:27 पर jthomas

इस उत्तर में पुस्तक संदर्भ भी अधिक जानकारी के लिए एक उपयोगी स्रोत प्रदान करता है।
स्टीवन सी। हॉवेल

1
यह वही जवाब है जो डाकू का था, जो तीन साल पहले आया था।
मर्सोस

90

यदि किसी को सामान्य एक-लाइनर में दिलचस्पी है, तो बस वर्तमान टिक प्राप्त करें और हर दूसरे टिक का नमूना करके नई टिक सेट करने के लिए इसका उपयोग करें।

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

3
विभिन्न टिक प्रकारों के लिए यह एकमात्र सामान्य जवाब है (str, फ्लोट,
डेटाइम

2
गैर-पूर्णांक टिक निकालें: ax.set_xticks([tick for tick in ax.get_xticks() if tick % 1 == 0])
user2839288

ऊपर विस्तृत समाधान के बहुत सारे लेकिन मैं मानता हूं कि यह सबसे संक्षिप्त है। तुम भी ax.get_xticks () की लंबाई निकाल सकते हैं और आवश्यक लंबाई की संख्या से विभाजित इस लंबाई से टुकड़ा करने की आवृत्ति सेट कर सकते हैं।
डी

मुझे लगता है कि यह सबसे अच्छा जवाब है। अधिकांश अन्य उत्तर बहुत जटिल और लागू / सामान्य करने में कठिन हैं। धन्यवाद!
सीनकाला

2
यह केवल लाठी की संख्या को कम कर सकता है, जबकि प्रश्न में (और मेरा लक्ष्य मुझे कैसे मिला) इसे बढ़ाना था।
अलेक्सई मार्टिआनोव

36

यह थोड़ा हैकरी है, लेकिन अब तक सबसे साफ / आसान उदाहरण को समझने के लिए कि मैंने ऐसा करने के लिए पाया है। यह SO पर एक उत्तर से यहाँ है:

Matplotlib colorbar में हर nth टिक लेबल को छिपाने का सबसे साफ तरीका?

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

फिर आप उन लेबलों पर लूप कर सकते हैं जो उन्हें दिखाई दे रहे घनत्व पर निर्भर करता है या नहीं।

संपादित करें: ध्यान दें कि कभी-कभी matplotlib लेबल == सेट करता है '', इसलिए ऐसा लग सकता है कि कोई लेबल मौजूद नहीं है, जब वास्तव में यह है और बस कुछ भी प्रदर्शित नहीं कर रहा है। यह सुनिश्चित करने के लिए कि आप वास्तविक दृश्य लेबल के माध्यम से लूपिंग कर रहे हैं, आप कोशिश कर सकते हैं:

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]छिपे हुए लेबल होते हैं।
जोलवी

यह matplotlib.finance.candlestick2 के साथ काम नहीं करता है
BCR

@ BCR यह हो सकता है कि कुछ xticklabels केवल ''इसलिए सेट किए जाते हैं कि जब आप उनके माध्यम से लूप करते हैं, तो आप xticklabels बना रहे हैं जो खाली अदृश्य हैं (जिसका विज़ुअलाइज़ेशन पर कोई प्रभाव नहीं होगा, लेकिन इसका मतलब यह हो सकता है कि आप इसे खींच नहीं रहे हैं सही लेबल)। आप कोशिश कर सकते हैं: vis_labels = [label for label in ax.get_xticklabels() if label.get_visible() is True]; plt.setp(vis_labels[::2], visible==False)
choldgraf

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

और resadjust फ़ंक्शन को फिर से चलाएं।


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)

इसने मेरे लिए काम किया

यदि आप [१,५] (१ और ५ समावेशी) के बीच टिक चाहते हैं तो प्रतिस्थापित करें

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डिफ़ॉल्ट व्यवहार होता है, क्योंकि टिक्स निर्दिष्ट नहीं किए गए थे)।

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