टिक लेबल टेक्स्ट को संशोधित करें


216

मैं एक प्लॉट में कुछ चुनिंदा टिक लेबल के लिए कुछ संशोधन करना चाहता हूं।

उदाहरण के लिए, अगर मैं करता हूं:

label = axes.yaxis.get_major_ticks()[2].label
label.set_fontsize(size)
label.set_rotation('vertical')

फ़ॉन्ट आकार और टिक लेबल का अभिविन्यास बदल जाता है।

हालांकि, अगर कोशिश करें:

label.set_text('Foo')

टिक लेबल को संशोधित नहीं किया गया है। इसके अलावा अगर मैं:

print label.get_text()

कुछ भी नहीं छपा है।

यहाँ कुछ और विचित्रता है। जब मैंने यह कोशिश की:

 from pylab import *
 axes = figure().add_subplot(111)
 t = arange(0.0, 2.0, 0.01)
 s = sin(2*pi*t)
 axes.plot(t, s)
 for ticklabel in axes.get_xticklabels():
     print ticklabel.get_text()

केवल खाली तार मुद्रित होते हैं, लेकिन प्लॉट में '0.0', '0.5', '1.0', '1.5' और '2.0' के रूप में लेबल वाले टिक होते हैं।


क्या आप उस प्लाट की आपूर्ति कर सकते हैं जिसका उपयोग आपने लेबल प्राप्त करने के लिए किया था?
क्लाउडियो

आपको खाली लेबल मिल रहे हैं क्योंकि आपने अभी तक कैनवास नहीं खींचा है। यदि आप draw()लेबल मुद्रित करने का प्रयास करने से पहले कॉल करते हैं, तो आपको वह मिलेगा जो आप अपेक्षा करते हैं। व्यक्तिगत टिक लेबल सेट करना दुर्भाग्य से एक स्पर्श अधिक कठिन है (क्या हो रहा है कि टिक लोकेटर और फॉर्मैटर को रीसेट नहीं किया गया है और यह आपके द्वारा चीजों को ओवरराइड करता है set_text)। मैं एक उदाहरण में थोड़ा जोड़ूंगा, अगर कोई मुझे इसके लिए नहीं हराता है। मुझे फिलहाल बस पकड़नी है, हालांकि।
जो किंगटन

@JoeKington: बढ़िया! अपने फिक्स को देखने के लिए आगे देख रहे हैं।
पुनर्मिलन

@repoman - ठीक है, ऐसा लगता है कि मैंने एक स्पर्श भी जल्द ही बोल दिया। मेरे मन में मैटलपोटलिब के पुराने संस्करणों के लिए काम करता था, लेकिन नवीनतम संस्करण नहीं। मुझे थोड़ा और खुदाई करने की जरूरत है। यह कहा गया है, यह उतना जटिल नहीं होना चाहिए जितना कि ...
जो किंगटन

जवाबों:


298

कैविएट: जब तक टिकलैबल्स पहले से ही एक स्ट्रिंग पर सेट नहीं होते हैं (जैसा कि आमतौर पर उदाहरण के लिए एक बॉक्सप्लॉट होता है), यह मैटलोट्लिब के किसी भी संस्करण के साथ नए से काम नहीं करेगा 1.1.0। यदि आप वर्तमान गिटब मास्टर से काम कर रहे हैं, तो यह काम नहीं करेगा। मुझे यकीन नहीं है कि समस्या अभी तक क्या है ... यह एक अनपेक्षित परिवर्तन हो सकता है, या यह नहीं हो सकता है ...

आम तौर पर, आप इन पंक्तियों के साथ कुछ करेंगे:

import matplotlib.pyplot as plt

fig, ax = plt.subplots()

# We need to draw the canvas, otherwise the labels won't be positioned and 
# won't have values yet.
fig.canvas.draw()

labels = [item.get_text() for item in ax.get_xticklabels()]
labels[1] = 'Testing'

ax.set_xticklabels(labels)

plt.show()

यहां छवि विवरण दर्ज करें

इस कारण को समझने के लिए कि आपको इतने सारे हुप्स के माध्यम से कूदने की आवश्यकता क्यों है, आपको थोड़ा और अधिक समझने की जरूरत है कि मैटलपोटलिब कैसे संरचित है।

जब तक यह स्पष्ट रूप से नहीं बताया जाता है, तब तक माटप्लोटलिब जानबूझकर टिक्स आदि की "स्थैतिक" स्थिति को करने से बचता है। धारणा यह है कि आप प्लॉट के साथ बातचीत करना चाहते हैं, और इसलिए प्लॉट की सीमाएं, टिक, टिकलैबल्स आदि गतिशील रूप से बदल जाएंगे।

इसलिए, आप किसी दिए गए टिक लेबल का टेक्स्ट सेट नहीं कर सकते। डिफ़ॉल्ट रूप से, यह धुरी के लोकेटर और फॉर्मैटर द्वारा हर बार भूखंड खींचे जाने पर फिर से सेट होता है।

हालाँकि, यदि लोकेटर और स्वरूपक स्थिर हैं ( FixedLocatorऔर FixedFormatter, क्रमशः), तो टिक लेबल समान रहते हैं।

यह वही है set_*ticklabelsया ax.*axis.set_ticklabelsकरता है।

उम्मीद है कि यह धीरे-धीरे और अधिक स्पष्ट करता है कि व्यक्तिगत टिक लेबल को बदलना थोड़ा जटिल क्यों है।

अक्सर, जो आप वास्तव में करना चाहते हैं वह सिर्फ एक निश्चित स्थिति को एनोटेट करना है। उस मामले में annotate, बजाय देखो ।


10
यह वर्तमान संस्करण (1.20) के साथ काम नहीं करता है!
एंड्रयू जाफ

1
अगर टिक्कबल्स पहले से ही एक स्ट्रिंग के लिए सेट हैं जैसे कि एक बॉक्सप्लॉट, यह अभी भी काम कर रहा है। यह स्पष्ट हो सकता है, लेकिन चूंकि उत्तर की पहली पंक्ति यह है कि यह नए matplotlib संस्करणों पर काम नहीं कर रहा है, इसलिए उपयोगकर्ता इसे पूरी तरह से छोड़ सकते हैं (मैंने शुरू में किया था)। हो सकता है कि इसका जिक्र संक्षेप में करें।
joelostblom

2
मुझे लगता है कि आप इसे नीचे करने के लिए कर सकते हैं गाढ़ा plt.gca () set_xticklabels (लेबल)।
एलेक्सी

क्या होगा अगर मैं "परीक्षण" के फॉन्टवेट होना चाहता हूं, boldजबकि अन्य "लाइट" के फॉन्टवेट का उपयोग करते हैं। क्या इसे करने का कोई तरीका है?
स्टीवन

1
ज्यूपिटर नोटबुक में इसका उपयोग करने वालों के लिए fig.canvas.draw()यह महत्वपूर्ण है कि यह महत्वपूर्ण है
wander95

96

एक भी साथ ऐसा कर सकते pylab और xticks

import matplotlib
import matplotlib.pyplot as plt
x = [0,1,2]
y = [90,40,65]
labels = ['high', 'low', 37337]
plt.plot(x,y, 'r')
plt.xticks(x, labels, rotation='vertical')
plt.show()

http://matplotlib.org/examples/ticks_and_spines/ticklabels_demo_rotation.html


यह एक सरल उपाय है और pyplot 1.5.1 के साथ काम करता है। इसे उखाड़ा जाना चाहिए।
शब्दशः

हालाँकि यह प्रश्न इसके लिए नहीं पूछा गया था, फिर भी मैं इस बात की सराहना करता हूं कि यह उदाहरण आपको उनके लेबल को संशोधित करने के साथ ही टिक्स का स्थान निर्धारित करने देता है।
ग्रहण

आधुनिक मेटप्लोटलिब डॉक्स से : "पाइलैब को हटा दिया गया है और इसका उपयोग नामस्थान प्रदूषण के कारण दृढ़ता से हतोत्साहित किया गया है। इसके बजाय पाइलपॉट का उपयोग करें।"
नाथनियल जोन्स

93

के नए संस्करणों में matplotlib, यदि आप टिक लेबल को strमानों के एक समूह के साथ सेट नहीं करते हैं, तो वे ''डिफ़ॉल्ट रूप से होते हैं (और जब भूखंड खींचता है तो लेबल केवल टिक मान होते हैं)। यह जानते हुए कि, अपने वांछित उत्पादन को पाने के लिए कुछ इस तरह की आवश्यकता होगी:

>>> from pylab import *
>>> axes = figure().add_subplot(111)
>>> a=axes.get_xticks().tolist()
>>> a[1]='change'
>>> axes.set_xticklabels(a)
[<matplotlib.text.Text object at 0x539aa50>, <matplotlib.text.Text object at 0x53a0c90>, 
<matplotlib.text.Text object at 0x53a73d0>, <matplotlib.text.Text object at 0x53a7a50>, 
<matplotlib.text.Text object at 0x53aa110>, <matplotlib.text.Text object at 0x53aa790>]
>>> plt.show()

और परिणाम: यहां छवि विवरण दर्ज करें

और अब अगर आप जांच करते हैं _xticklabels, तो वे अब एक गुच्छा नहीं हैं ''

>>> [item.get_text() for item in axes.get_xticklabels()]
['0.0', 'change', '1.0', '1.5', '2.0']

यह 1.1.1rc1वर्तमान संस्करण से संस्करणों में काम करता है 2.0


धन्यवाद, यह वह उत्तर है जिसकी मुझे तलाश थी। सबसे साफ समाधान आईएमओ; बस set_xticklabelsतार और वस्तुओं की मिश्रित सूची के साथ आपूर्ति करें।
ल्यूक डेविस

ध्यान रखें कि यदि टिक लेबल को इन्टस के रूप में सेट किया गया है, तो यह उन्हें फ्लोट में बदल देगा। आसानी से चारों ओर काम किया, लेकिन ध्यान देने योग्य है।
ApproachingDarknessFish

यह काम किया ( ax.get_xticks().tolist())। सबसे अधिक मतदान समाधान ( ax.get_xtickslabels()) नहीं था । किसी तरह यह पहले plt.show()उत्सर्जित होने से पहले लेबल को निकालने में सक्षम नहीं था, हालांकि मैंने fig.canvas.draw()सुझाव दिया था।
साइफ्रेक्स

FYI करें, आधुनिक मेटप्लोटलिब डॉक्स से : "पाइलैब को पदावनत किया जाता है और इसका उपयोग नामस्थान प्रदूषण के कारण दृढ़ता से हतोत्साहित किया जाता है। इसके बजाय pyplot का उपयोग करें।"
नाथनियल जोन्स

17

यह प्रश्न पूछे जाने के बाद से ही कुछ समय हो गया है। आज तक ( matplotlib 2.2.2) और कुछ पढ़ने और परीक्षण के बाद, मुझे लगता है कि सबसे अच्छा / उचित तरीका निम्नलिखित है:

माटप्लोटलिब का एक मॉड्यूल है जिसका नाम tickerहै "पूरी तरह से कॉन्फ़िगर करने योग्य टिक लगाने और स्वरूपण का समर्थन करने के लिए कक्षाएं" । प्लॉट से एक विशिष्ट टिक को संशोधित करने के लिए, मेरे लिए निम्नलिखित काम करता है:

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

def update_ticks(x, pos):
    if x == 0:
        return 'Mean'
    elif pos == 6:
        return 'pos is 6'
    else:
        return x

data = np.random.normal(0, 1, 1000)
fig, ax = plt.subplots()
ax.hist(data, bins=25, edgecolor='black')
ax.xaxis.set_major_formatter(mticker.FuncFormatter(update_ticks))
plt.show()

एक सामान्य वितरण से यादृच्छिक मूल्यों के साथ हिस्टोग्राम

चेतावनी! xटिक का मूल्य है और posअक्ष में इसकी सापेक्ष स्थिति है। ध्यान दें कि posमूल्यों को शुरू करते समय 1, 0सामान्य रूप से अनुक्रमित करते समय नहीं ।


मेरे मामले में, मैं y-axisप्रतिशत मूल्यों के साथ हिस्टोग्राम को प्रारूपित करने की कोशिश कर रहा था । mtickerएक अन्य वर्ग का नाम है PercentFormatterजो पहले की तरह एक अलग फ़ंक्शन को परिभाषित करने की आवश्यकता के बिना आसानी से ऐसा कर सकता है:

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

data = np.random.normal(0, 1, 1000)
fig, ax = plt.subplots()
weights = np.ones_like(data) / len(data)
ax.hist(data, bins=25, weights=weights, edgecolor='black')
ax.yaxis.set_major_formatter(mticker.PercentFormatter(xmax=1.0, decimals=1))
plt.show()

एक सामान्य वितरण से यादृच्छिक मूल्यों के साथ हिस्टोग्राम

इस मामले xmaxमें डेटा मान है जो 100% से मेल खाता है। प्रतिशत की गणना इस प्रकार की जाती है x / xmax * 100, इसीलिए हम इसे ठीक करते हैं xmax=1.0। इसके अलावा, decimalsबिंदु के बाद दशमलव स्थानों की संख्या है।


12

अक्ष वर्ग में एक set_yticklabels फ़ंक्शन है जो आपको टिक लेबल सेट करने की अनुमति देता है, जैसे:

#ax is the axes instance
group_labels = ['control', 'cold treatment',
             'hot treatment', 'another treatment',
             'the last one']

ax.set_xticklabels(group_labels)

मैं अभी भी काम कर रहा हूं कि ऊपर का उदाहरण आपके काम क्यों नहीं आया।


3
लेकिन मैं केवल एक लेबल को बदलना चाहता हूं। उपरोक्त चाल के लिए आवश्यक है कि आप सभी टिक लेबल निकालें और वांछित को एक नए मान पर सेट करें। लेकिन जब लेबल.get_text () रिटर्न कुछ नहीं होता है तो मैं टिक लेबल कैसे निकाल सकता हूं?
रीमन

11

यह काम:

import matplotlib.pyplot as plt

fig, ax1 = plt.subplots(1,1)

x1 = [0,1,2,3]
squad = ['Fultz','Embiid','Dario','Simmons']

ax1.set_xticks(x1)
ax1.set_xticklabels(squad, minor=False, rotation=45)

Feds


7

यह भी matplotlib 3 में काम करता है:

x1 = [0,1,2,3]
squad = ['Fultz','Embiid','Dario','Simmons']

plt.xticks(x1, squad, rotation=45)

5

आप के साथ काम नहीं करते हैं figऔर axऔर आप सभी लेबल को संशोधित करना चाहते (सामान्य के लिए उदाहरण के लिए) आप यह कर सकते हैं:

labels, locations = plt.yticks()
plt.yticks(labels, labels/max(labels))


-4

तुम कर सकते हो:

for k in ax.get_xmajorticklabels():
    if some-condition:
        k.set_color(any_colour_you_like)

draw()

क्या कोई समझा सकता है कि यह जवाब इतना भारी क्यों है?
ह्लिनूर डेविस हिल्सनसन

@ HlynurDavíðHlynsson मुझे लगता है कि यह वास्तव में सवाल के साथ कुछ करने के लिए नहीं है। खैर, शायद कुछ संपादन के साथ ... कृपया इसे संपादित करें, अगर आपको इसे प्रश्न से संबंधित करना है। ;)
प्यार करता था।बस 16
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.