matplotlib: পুরো সংখ্যা বা নির্দিষ্ট সংখ্যায় ফরম্যাট অক্ষ অফসেট-মান


92

আমার কাছে একটি ম্যাটপ্ল্লিটিব চিত্র রয়েছে যা আমি ডেটা প্লট করছি যা সর্বদা ন্যানোসেকেন্ডস (1e-9) হিসাবে উল্লেখ করা হয়। Y- অক্ষের উপর, যদি আমার কাছে ডেটা থাকে যা দশ ন্যানো সেকেন্ড, অর্থাৎ ie 44e-9, অক্ষটির মান একটি অফসেট হিসাবে +1 1-8 সহ 4.4 হিসাবে দেখায়। অক্ষরগুলি কী +1 1-9 অফসেটের সাথে 44 প্রদর্শন করতে বাধ্য করা যায়?

একইটি আমার এক্স-অক্ষের জন্য যায় যেখানে অক্ষটি দেখানো হয় + 5.54478e4, যেখানে আমি বরং এটি +55447 এর অফসেট দেখাব (পুরো সংখ্যা, দশমিক নয় - মান এখানে দিনগুলিতে আসে)।

আমি এরকম দুটি জিনিস চেষ্টা করেছি:

p = axes.plot(x,y)
p.ticklabel_format(style='plain')

এক্স অক্ষের জন্য, তবে এটি কার্যকর হয় না, যদিও আমি সম্ভবত এটি ডক্স থেকে ভুলভাবে ব্যবহার করছি বা কোনও ভুল ব্যাখ্যা করছি, কেউ কি আমাকে সঠিক দিকে নির্দেশ করতে পারে?

ধন্যবাদ, জনাথন

সমস্যার চিত্রণ


আমি ফর্ম্যাটরগুলির সাহায্যে কিছু করার চেষ্টা করেছি কিন্তু এখনও কোনও সমাধান পাইনি ...:

myyfmt = ScalarFormatter(useOffset=True)
myyfmt._set_offset(1e9)
axes.get_yaxis().set_major_formatter(myyfmt)

এবং

myxfmt = ScalarFormatter(useOffset=True)
myxfmt.set_portlimits((-9,5))
axes.get_xaxis().set_major_formatter(myxfmt)

পাশের নোটে, আমি আসলে 'বিস্মিত হয়ে আছি যে' অফসেট নম্বর 'অবজেক্টটি আসলে কোথায় থাকে ... এটি কি বড় / গৌণ টিক্সের অংশ?


4
আপনি চেষ্টা করেছেন set_units? matplotlib.sourceforge.net/api/… (আমি এখানে চেষ্টা করতে পারি না কারণ এখানে আমার
ম্যাটপ্ল্লোব নেই

4
আমি set_units ফাংশনটি পরীক্ষা করে দেখেছি এবং এটি প্রয়োজনীয়তার চেয়ে জটিল মনে হয়েছে (একটি অতিরিক্ত মডিউল লিখতে / যুক্ত করতে হবে ?? - বেসিক_উনিটস?)। কেবল টিকের বিন্যাস সম্পাদনা করার একটি উপায় থাকতে হবে। ইউনিট / সেট_উনিট ফাংশনটিকে ইউনিট রূপান্তরকরণের লাইনের সাথে আরও বেশি মনে হয়। যদিও টিপটির জন্য ধন্যবাদ, এটি আমাকে অন্য কয়েকটি সমাধানে নিয়ে গেছে যা আমি এখন সন্ধান করছি!
জোনাথন

4
দয়া rcParamsকরে ডিফল্টরূপে বন্ধ করা বিবেচনা rcParams["axes.formatter.useoffset"] = Falseকরুন: এখানে যেমন: stackoverflow.com/questions/24171064/…
রাগেরো তুরা

উত্তর:


100

আমার ঠিক একই সমস্যা ছিল এবং এই লাইনগুলি সমস্যাটি স্থির করেছে:

from matplotlib.ticker import ScalarFormatter

y_formatter = ScalarFormatter(useOffset=False)
ax.yaxis.set_major_formatter(y_formatter)

4
এটি দ্রুত এবং সহজ উত্তর। ধন্যবাদ.
সর্বোচ্চ

6
একটি ওয়ান-লাইনার ax.get_yaxis().get_major_formatter().set_useOffset(False)
হ'ল

4
আমার মতো from matplotlib.ticker import ScalarFormatterনুবুকদের জন্য @ গঞ্জলোর কোডটি কাজ করতে বা ভুলতে বা উপরের দিকে
@ দাতামানের

36

আরও সহজ সমাধানটি হ'ল টিক লেবেলগুলি কেবল কাস্টমাইজ করা। এই উদাহরণটি ধরুন:

from pylab import *

# Generate some random data...
x = linspace(55478, 55486, 100)
y = random(100) - 0.5
y = cumsum(y)
y -= y.min()
y *= 1e-8

# plot
plot(x,y)

# xticks
locs,labels = xticks()
xticks(locs, map(lambda x: "%g" % x, locs))

# ytikcs
locs,labels = yticks()
yticks(locs, map(lambda x: "%.1f" % x, locs*1e9))
ylabel('microseconds (1E-9)')

show()

বিকল্প পাঠ

লক্ষ্য করুন যে কীভাবে y-axis ক্ষেত্রে, আমি 1e9তারপরে মানগুলি বহুগুণ করে y- লেবেলে ধ্রুবকটি উল্লেখ করেছি


সম্পাদনা

অন্য বিকল্পটি হ'ল প্লটটির শীর্ষে ম্যানুয়ালি তার পাঠ্য যুক্ত করে এক্সপোশন গুণককে জাল করা:

locs,labels = yticks()
yticks(locs, map(lambda x: "%.1f" % x, locs*1e9))
text(0.0, 1.01, '1e-9', fontsize=10, transform = gca().transAxes)

EDIT2

এছাড়াও আপনি একইভাবে x- অক্ষ অফসেট মান ফর্ম্যাট করতে পারেন:

locs,labels = xticks()
xticks(locs, map(lambda x: "%g" % x, locs-min(locs)))
text(0.92, -0.07, "+%g" % min(locs), fontsize=10, transform = gca().transAxes)

বিকল্প পাঠ


প্রথমে আমি ঠিক তাই করেছি। দুর্ভাগ্যক্রমে, অক্ষের গুণকটি সেট করার / প্রদর্শন করার সহজ উপায় আমি খুঁজে পাইনি (যেমনটি আপনি করেছেন ঠিক তেমন y- অক্ষ লেবেলে রেখেছেন))। যদি আপনি অক্ষ গুণক লেবেল না আপত্তি না করেন, এটি সহজ উপায়। যেভাবেই হোক, আমার কাছ থেকে +1।
জো কিংটন

4
@ জো কিংটন: আপনি এটি পাঠ্য হিসাবে ম্যানুয়ালি যুক্ত করতে পারেন ... উপরের সম্পাদনাটি দেখুন :)
আম্রো

দুর্দান্ত! আমি এক্স অক্ষের জন্য লেবেলগুলির সাথে আপনার পদ্ধতির চেষ্টা করতে যাচ্ছি। আমি প্রথম x মানটির তলটি নিয়ে যাব, তারপরে প্রতিটি এক্স-মান থেকে এটি সরিয়ে ফেলব এবং একটি লেবেল হিসাবে একটি "+ মিন্সভাল" যুক্ত করব। এক্স-টিক অফসেটটি অন্য কীভাবে ফর্ম্যাট করবেন তা আমি বুঝতে পারি না। আমি অফসেটের প্রস্থের সাথে ঠিক আছি, এটির জন্য কেবলমাত্র অ-ঘৃণ্য মান হিসাবে প্রদর্শন করা দরকার।
জোনাথন

কি দারুন. আপনি কীভাবে ম্যাটপ্লটলিবের নিয়ন্ত্রণ নিতে পারেন এবং এটি আপনার প্রয়োজন এবং সত্য এবং কিছু প্লাজাজ আপনার প্লটগুলিতে করতে পারেন তা দেখানোর দুর্দান্ত কাজ in
পদার্থ বিজ্ঞান

আপনি চিত্রটিতে 1e-9 এর ফন্টসাইজটি কীভাবে পরিবর্তন করবেন?
একটি অফার

30

ScalarFormatterআপনার যা প্রয়োজন তা করতে আপনাকে সাবক্লাস করতে হবে ... _set_offsetকেবল একটি ধ্রুবক যুক্ত করুন, আপনি সেট করতে চান ScalarFormatter.orderOfMagnitude। দুর্ভাগ্যক্রমে, ম্যানুয়ালি সেটিং orderOfMagnitudeকোনও কাজ করবে না, কারণ ScalarFormatterঅক্ষটি টিক লেবেলগুলিকে ফর্ম্যাট করার জন্য ইনস্ট্যান্সটি বলা হয়ে থাকে reset এটি এত জটিল হওয়া উচিত নয় তবে আপনি যা চান ঠিক তেমন করার সহজ উপায় আমি খুঁজে পাচ্ছি না ... এখানে একটি উদাহরণ দেওয়া হল:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.ticker import ScalarFormatter, FormatStrFormatter

class FixedOrderFormatter(ScalarFormatter):
    """Formats axis ticks using scientific notation with a constant order of 
    magnitude"""
    def __init__(self, order_of_mag=0, useOffset=True, useMathText=False):
        self._order_of_mag = order_of_mag
        ScalarFormatter.__init__(self, useOffset=useOffset, 
                                 useMathText=useMathText)
    def _set_orderOfMagnitude(self, range):
        """Over-riding this to avoid having orderOfMagnitude reset elsewhere"""
        self.orderOfMagnitude = self._order_of_mag

# Generate some random data...
x = np.linspace(55478, 55486, 100) 
y = np.random.random(100) - 0.5
y = np.cumsum(y)
y -= y.min()
y *= 1e-8

# Plot the data...
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x, y, 'b-')

# Force the y-axis ticks to use 1e-9 as a base exponent 
ax.yaxis.set_major_formatter(FixedOrderFormatter(-9))

# Make the x-axis ticks formatted to 0 decimal places
ax.xaxis.set_major_formatter(FormatStrFormatter('%0.0f'))
plt.show()

যা এর মতো কিছু দেয়: বিকল্প পাঠ

অন্যদিকে, ডিফল্ট ফর্ম্যাটিংয়ের মতো দেখতে হবে: বিকল্প পাঠ

আশা করি যে কিছুটা সাহায্য করবে!

সম্পাদনা করুন: এটির মূল্যের জন্য, আমি জানি না অফসেট লেবেলটি কোথায় থাকে ... এটি কেবল ম্যানুয়ালি সেট করা কিছুটা সহজ হবে তবে আমি কীভাবে এটি করব তা বুঝতে পারি না ... আমি অনুভূতিটি পাই এই সমস্ত চেয়ে একটি সহজ উপায় আছে। এটি কাজ করে, যদিও!


ধন্যবাদ! স্ক্যালারফর্ম্যাটর সাবক্লাসিং দুর্দান্ত কাজ করে! তবে আমি অনুমান করি যে আমি এক্স-অক্ষের জন্য কী চাই clearly আমি এক্স-অক্ষের জন্য অফসেট রাখতে চাই, তবে অফসেটের মানটি ফর্ম্যাট করুন যাতে এটি কোনও ব্যয়কারী হিসাবে দেখানো হয় না।
জোনাথন

এই একমাত্র পদ্ধতি যা আমার পক্ষে কাজ করেছিল! ধন্যবাদ :)
ওশিয়ান সায়েন্টিস্ট

11

আম্রোর উত্তরের মতো, আপনি ফানকফর্ম্যাটর ব্যবহার করতে পারেন

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

# Generate some random data...
x = np.linspace(55478, 55486, 100) 
y = np.random.random(100) - 0.5
y = np.cumsum(y)
y -= y.min()
y *= 1e-8

# Plot the data...
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x, y, 'b-')

# Force the y-axis ticks to use 1e-9 as a base exponent 
ax.yaxis.set_major_formatter(FuncFormatter(lambda x, pos: ('%.1f')%(x*1e9)))
ax.set_ylabel('microseconds (1E-9)')

# Make the x-axis ticks formatted to 0 decimal places
ax.xaxis.set_major_formatter(FuncFormatter(lambda x, pos: '%.0f'%x))
plt.show()

5

গনজালো এর সমাধান যোগ করার পরে আমার পক্ষে কাজ শুরু করে set_scientific(False):

ax=gca()
fmt=matplotlib.ticker.ScalarFormatter(useOffset=False)
fmt.set_scientific(False)
ax.xaxis.set_major_formatter(fmt)


4

আমি মনে করি যে আরও মার্জিত উপায় হ'ল টিকার বিন্যাস ব্যবহার করা। জ্যাক্সিস এবং ইয়্যাক্সিস উভয়ের জন্য এখানে একটি উদাহরণ রয়েছে:

from pylab import *
from matplotlib.ticker import MultipleLocator, FormatStrFormatter

majorLocator   = MultipleLocator(20)
xFormatter = FormatStrFormatter('%d')
yFormatter = FormatStrFormatter('%.2f')
minorLocator   = MultipleLocator(5)


t = arange(0.0, 100.0, 0.1)
s = sin(0.1*pi*t)*exp(-t*0.01)

ax = subplot(111)
plot(t,s)

ax.xaxis.set_major_locator(majorLocator)
ax.xaxis.set_major_formatter(xFormatter)
ax.yaxis.set_major_formatter(yFormatter)

#for the minor ticks, use no labels; default NullFormatter
ax.xaxis.set_minor_locator(minorLocator)

4
এটি প্রশ্নের উত্তর দেয় না, যা কীভাবে অফসেট এবং / অথবা বৈজ্ঞানিক স্বরলিপিতে ব্যবহৃত ফ্যাক্টরটি নির্দিষ্ট করতে হয়
sodd

@ উত্তরদেব এমনকি যদি আমার উত্তরটি বিশেষভাবে প্রশ্নের উত্তর না দেয় তবে এটি এখনও একটি ইঙ্গিত দেয়। বার্তাটি হ'ল আপনি অন্য ফরম্যাটারটি চয়ন করতে পারেন এবং আমার উদাহরণ থেকে তারিখের পরিবর্তে আপনি যা চান তা পেতে পারেন। বৈজ্ঞানিক বিশ্বে জুলিয়ান দিবসটি আদর্শ বা আপনি আমার উদাহরণ হিসাবে তারিখটি ব্যবহার করতে পারেন। আমি যা পরামর্শ দেওয়ার চেষ্টা করছিলাম তা হ'ল একটি ভিন্ন পন্থা নেওয়া যেতে পারে। কখনও কখনও একটি প্রশ্ন জিজ্ঞাসা করা যেতে পারে কারণ এই মুহুর্তে ব্যক্তির আরও ভাল ধারণা নেই। বিকল্প সমাধানগুলি বাতিল বা অসম্মানজনক আচরণ করা উচিত নয়। সব মিলিয়ে আমি -১ ভোট প্রাপ্য ছিল না।
বোগদান

2

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

class CustomScalarFormatter(ScalarFormatter):
    def format_data(self, value):
        if self._useLocale:
            s = locale.format_string('%1.2g', (value,))
        else:
            s = '%1.2g' % value
        s = self._formatSciNotation(s)
        return self.fix_minus(s)
xmajorformatter = CustomScalarFormatter()  # default useOffset=True
axes.get_xaxis().set_major_formatter(xmajorformatter)

অবশ্যই আপনি যা চান বিন্যাস স্ট্রিং সেট করতে পারেন।


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