টিক লেবেল পাঠ্য সংশোধন করুন


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)। আমি কিছুটা উদাহরণ দিয়ে দেব, যদি কেউ আমাকে এতে মারধর করেন না। যদিও এই মুহুর্তে আমাকে বাস ধরতে হবে।
জো কিংটন

@ জোকিংটন: দুর্দান্ত! আপনার সংশোধন দেখার জন্য অপেক্ষা করছি
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
যদি টিক্যালাবলগুলি ইতিমধ্যে একটি বক্সপ্লট হিসাবে স্ট্রিংটিতে সেট করা থাকে তবে এটি এখনও কাজ করে। এটি সুস্পষ্ট হতে পারে, তবে যেহেতু উত্তরের প্রথম লাইনটি এটি নতুন ম্যাটপ্ল্লোলিব সংস্করণগুলিতে কাজ করছে না, ব্যবহারকারীরা এটি পুরোপুরি এড়িয়ে যেতে পারে (আমি প্রথম দিকে করেছি)। এটি সংক্ষেপে উল্লেখ করুন।
joelostblom

2
আমার মনে হয় আপনি এটিকে নিচু করে plt.gca ()। set_xticklabels (লেবেল)
অ্যালেক্সে

আমি যদি "টেস্টিং" এর ফন্টওয়েট চাই, boldঅন্যরা "আলোক" এর ফন্টওয়েট ব্যবহার করতে চাই তবে কী হবে । এটি করার কোন উপায় আছে?
স্টিভেন

1
যারা এটি একটি বৃহত্তর নোটবুকে ব্যবহার করছেন তাদের পক্ষে fig.canvas.draw()এটি গুরুত্বপূর্ণ যে উল্লেখযোগ্যভাবে উপকৃত হতে পারে
২১ শে

96

পাইলাব এবং অস্টিক্সের সাহায্যে কেউ এটি করতে পারে

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


এটি একটি সহজ সমাধান এবং পাইপ্লট 1.5.5 এর সাথে কাজ করে। এটি upvote করা উচিত।
ওয়ার্ডস্মিথে

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

আধুনিক ম্যাটপ্ল্লোলিব ডক্স থেকে : "পাইব্লব অবমূল্যায়ন করা হয়েছে এবং নেমস্পেস দূষণের কারণে এর ব্যবহার দৃ strongly়ভাবে নিরুৎসাহিত করা হয়েছে। পরিবর্তে পাইপ্লট ব্যবহার করুন।"
নাথানিয়েল জোন্স

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স্ট্রিং এবং টিক অবজেক্টের একটি মিশ্র তালিকা সরবরাহ করুন ।
লুক ডেভিস

সচেতন থাকুন যে টিক লেবেলগুলি ইনট হিসাবে সেট করা থাকলে এটি তাদের ফ্লোটে পরিবর্তন করবে। সহজেই চারপাশে কাজ করেছেন তবে লক্ষণীয়।
ডার্কনেস

এই এক কাজ করেছে ( ax.get_xticks().tolist())। সর্বাধিক ভোট দেওয়া সমাধান ( ax.get_xtickslabels()) হয়নি । plt.show()উত্সাহিত হওয়ার আগে কোনওরকম এটি লেবেলগুলি বের করতে সক্ষম হয় নি, যদিও আমি fig.canvas.draw()প্রস্তাবিত হিসাবে ব্যবহার করেছি ।
সাইফারএক্স

আধুনিক ম্যাটপ্ল্লোলিব ডক্স থেকে এফওয়াইআই : "পাইব্লব অবমূল্যায়ন করা হয়েছে এবং নেমস্পেস দূষণের কারণে এর ব্যবহার কঠোরভাবে নিরুৎসাহিত করা হয়েছে। পরিবর্তে পাইপ্লট ব্যবহার করুন।"
নাথানিয়েল জোনস

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নয় Notice0


আমার ক্ষেত্রে, আমি 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

অক্ষ শ্রেণীর একটি সেট_সাইটিক্যালবেলস ফাংশন রয়েছে যা আপনাকে টিক লেবেলগুলি সেট করতে দেয়, যেমন:

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

ax.set_xticklabels(group_labels)

আপনার উদাহরণটি কেন কাজ করে নি আমি এখনও কাজ করছি।


3
তবে আমি কেবল একটি একক লেবেল পরিবর্তন করতে চাই। উপরের কৌশলটি আপনাকে সমস্ত টিক লেবেল উত্তোলন এবং পছন্দসইটিকে একটি নতুন মান হিসাবে সেট করতে হবে। লেবেল.গেট টেক্সট () কিছুই না ফেরালে আমি কীভাবে টিক লেবেলগুলি বের করতে পারি?
repoman

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

এটি ম্যাটপ্ল্লিটিব 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()

কেউ উত্তর দিতে পারে কেন এই উত্তরটি এত ভারী হয়?
Hlynur Davíð Hlynsson

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