प्लॉट टिक की संख्या कम करना


160

मेरे ग्राफ पर बहुत अधिक टिक हैं और वे एक दूसरे में चल रहे हैं।

मैं टिक्सेस की संख्या कैसे कम कर सकता हूं?

उदाहरण के लिए, मेरे पास टिक हैं:

1E-6, 1E-5, 1E-4, ... 1E6, 1E7

और मैं केवल चाहता हूँ:

1E-5, 1E-3, ... 1E5, 1E7

मैं के साथ खेलने की कोशिश की है LogLocator, लेकिन मैं यह पता लगाने में सक्षम नहीं किया गया है।

जवाबों:


266

वैकल्पिक रूप से, यदि आप केवल माकपोटलिब को उन्हें (वर्तमान में केवल साथ MaxNLocator) स्थिति की अनुमति देते हुए टिक्क की संख्या निर्धारित करना चाहते हैं, तो pyplot.locator_params,

pyplot.locator_params(nbins=4)

आप नीचे बताए अनुसार इस विधि में विशिष्ट अक्ष निर्दिष्ट कर सकते हैं, डिफ़ॉल्ट दोनों है:

# To specify the number of ticks on both or any single axes
pyplot.locator_params(axis='y', nbins=6)
pyplot.locator_params(axis='x', nbins=10)

27
यह एक महान सुझाव था, यह निर्दिष्ट करने में सक्षम होने pyplot.locator_params(axis = 'x', nbins = 4)(या axis = 'y') ने प्रक्रिया को वास्तव में सीधा कर दिया। धन्यवाद @bgamari!
बेंजामिनोग्रामस

8
लॉग स्केल के साथ, इसने numticksइसके बजाय काम कियाnbins
मेडुज

1
@bgamari, क्या आप numticks@meduz द्वारा इंगित किए गए लॉगरिदमिक भूखंडों के लिए समाधान जोड़ सकते हैं ?
लोटेन

7
यह उन लेबलों को रखने के लिए प्रतीत नहीं होता जहाँ उन्हें होना चाहिए। उदाहरण के लिए, यदि मूल टिक लेबल हैं [0, 1, ..., 99]और अब एक सेट होता है nticks=10, तो नए विरल लेबल को अक्ष के साथ दस गुना लंबे समय तक रखा जाएगा, यानी अब वही 1बैठेगा जहां 9था, 2कहां 19था ... और 9कहां 99था।
विम

2
इस विधि पर भरोसा करने से पहले अपने परिणामों की जाँच करें। @ वीम सही है। टिक मूल्यों को गलत तरीके से रखा जाएगा।
डेविड जे।

53

यदि किसी को अभी भी यह पृष्ठ खोज परिणामों में मिलता है:

fig, ax = plt.subplots()

plt.plot(...)

every_nth = 4
for n, label in enumerate(ax.xaxis.get_ticklabels()):
    if n % every_nth != 0:
        label.set_visible(False)

7
यह वास्तव में उन सभी अन्य उत्तरों के विरुद्ध काम करता है, जिन्होंने कुछ नहीं किया। धन्यवाद :)
faizan

बहुत बढ़िया। मुझे इसे खोजने में थोड़ा समय लगा लेकिन यह वही हुआ जो मुझे चाहिए था।
जॉन

धन्यवाद, यह सुनिश्चित करता है कि कौन से लेबल सही स्थिति में हैं। एक अतिरिक्त कदम जो इस उत्तर को बेहतर करेगा, वह टिक मार्क को भी हटा देगा।
डेविड जे।

महान सरल उत्तर - एसओ समुदाय के लिए ज्ञात कोई कस्टम विधि नहीं है। यह एक मूल्यवान अतिरिक्त होगा?
jabberwocky

32

अनुकूलन और टिक्स की उपस्थिति के मुद्दे को हल करने के लिए, Matplotlib वेबसाइट पर टिक लोकेटर गाइड देखें

ax.xaxis.set_major_locator(plt.MaxNLocator(3))

X- अक्ष में टिक्स की कुल संख्या को 3 पर सेट करेगा, और इसे अक्ष पर समान रूप से वितरित करेगा।

इस बारे में एक अच्छा ट्यूटोरियल भी है


केवल पहले 3 डेटाइम इंडेक्स का चयन करें। जब pandas.DataFrame.plot से कुल्हाड़ी मिल ax = df.plot()
Mithril

@ मुझे खेद है कि मुझे आपकी टिप्पणी समझ में नहीं आई। क्या आप कृपया विस्तार से बता सकते हैं?
प्रेजेथ जयथिसा

अगर मेरे पास pandas.DataFrameडेटाटाइम इंडेक्स [2019-01-01, ... 2019-11-01] के साथ एक डीएफ ( ) है, तो कॉल करें ax = df.plot(), एक फिगर ऑब्जेक्ट वापस करें । कॉल ax.xaxis.set_major_locator(plt.MaxNLocator(3)) केवल पहले 3 इंडेक्स [2019-01-01, 2019-01-02, 2019-01-03] को दिखाते हैं।
मिथिला

1
@ मैथिल, df.plot()अक्सर प्रदर्शित करता है minor_locator, इसलिए आप कोशिश करना चाह सकते हैं ax1.xaxis.set_minor_locator(plt.MaxNLocator(3))3उन टिकों की संख्या के लिए स्थानापन्न करना भी याद रखें जिन्हें आप प्रदर्शित करना चाहते हैं। पांडा timeseries के लिए मेरा सुझाव है import matplotlib.dates as mdatesऔर चलाने के ax.xaxis.set_minor_locator(mdates.MonthLocator(interval = 1))साथax.xaxis.set_minor_formatter(mdates.DateFormatter('%m-%Y'))
Prageeth Jayathissa

20

set_ticks()अक्ष वस्तुओं के लिए एक समारोह है।


4
यह काम करेगा अगर मुझे पहले से पता था कि मुझे क्या टिक चाहिए। मैंने जो उदाहरण दिया वह केवल एक उदाहरण था। मुझे नहीं पता कि टिक क्या हैं, मुझे पता है कि मैं उनमें से कम यानी हर दूसरे को चाहता हूं।
jlconlin

10
आप कुल्हाड़ी वस्तु के लिए get_xticks()या get_yticks()पहले कॉल कर सकते हैं , आवश्यकतानुसार संपादित कर सकते हैं, और फिर सूची को वापस पास कर सकते हैं set_ticks()
user812786

4
मेरे पास नहीं है set_ticks(), लेकिन मेरे पास है set_xticks()और है set_yticks()। ये अक्षीय वस्तुओं की विशेषता हैं, अक्ष की नहीं। शायद यह पिछले कुछ वर्षों के दौरान बदल गया है।
गौथियर

2
मुझे यकीन नहीं है कि अगर मुझे चाहिए, तो कुछ लोगों ने आपके उत्तर को उपयोगी पाया है, और सिर्फ इसलिए कि यह मेरे लिए अलग है इसका मतलब यह नहीं है कि यह हर किसी के लिए है।
गौथियर

1
एक उदाहरण इस उत्तर को उपयोगी बनाने की दिशा में एक लंबा रास्ता तय करेगा।
रिचर्ड

10

यदि किसी को अभी भी इसकी आवश्यकता है, और चूंकि यहां कुछ भी वास्तव में मेरे लिए काम नहीं करता है, तो मैं एक बहुत ही सरल तरीके से आया, जो उत्पन्न प्लॉट की उपस्थिति को "एन" के रूप में रखता है, जबकि टिक की संख्या को ठीक करने के लिए एन:

import numpy as np
import matplotlib.pyplot as plt

f, ax = plt.subplots()
ax.plot(range(100))

ymin, ymax = ax.get_ylim()
ax.set_yticks(np.round(np.linspace(ymin, ymax, N), 2))

2
मुझे फ्लोट के बजाय मान को वापस लाने के लिए अंतिम पंक्ति को थोड़ा संशोधित करना पड़ा:ax.set_yticks(np.linspace(int(ymin), int(ymax), N), 2)
निक सेजेजे सेप

@NickSettje अभी भी मेरे साथ तैरता है!
मोहम्मद

4

@Raphael ने जो समाधान दिया वह सीधा और काफी मददगार है।

फिर भी, प्रदर्शित टिक लेबल मूल वितरण से नमूना किए गए मान नहीं होंगे, लेकिन द्वारा दिए गए सरणी के अनुक्रमित से np.linspace(ymin, ymax, N)

अपने मूल टिक लेबल से समान रूप से दूरी एन मूल्यों को प्रदर्शित करने के लिए, set_yticklabels()विधि का उपयोग करें । यहाँ पूर्णांक लेबल के साथ y अक्ष के लिए एक स्निपेट है:

import numpy as np
import matplotlib.pyplot as plt

ax = plt.gca()

ymin, ymax = ax.get_ylim()
custom_ticks = np.linspace(ymin, ymax, N, dtype=int)
ax.set_yticks(custom_ticks)
ax.set_yticklabels(custom_ticks)

इस अच्छा tweak के लिए यश!
मोहम्मद

2

जब एक लॉग स्केल का उपयोग किया जाता है तो निम्नलिखित कमांड के साथ प्रमुख टिकों की संख्या तय की जा सकती है

import matplotlib.pyplot as plt

....

plt.locator_params(numticks=12)
plt.show()

numticksप्रदर्शित होने वाले अक्ष टिक की संख्या निर्धारित करने के लिए निर्धारित मान ।

locator_params()फ़ंक्शन शुरू करने के लिए @ बामगारी की पोस्ट को क्रेडिट , लेकिन nticksलॉग स्केल का उपयोग करने पर पैरामीटर एक त्रुटि फेंकता है।


प्रश्न और उत्तर पिछले matplotlib के लिए हैं, अर्थात 1, और आप 2 का उल्लेख कर रहे हैं
Dawid Laszuk
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.