2013-06-18 10 views
8

टिक्स matplotlib में, जब मैं एक धुरी पर एक log पैमाने का उपयोग करें, यह हो सकता है कि उस अक्ष कोई बड़ा टिक, केवल मामूली लोगों होगा। तो इसका मतलब है कोई लेबल पूरे धुरी के लिए दिखाए जाते हैं।matplotlib: नाबालिग के लिए शो लेबल भी

मैं कैसे निर्दिष्ट कर सकता हूं कि मुझे मामूली टिकों के लिए लेबल की भी आवश्यकता है?

मैंने कोशिश की:

plt.setp(ax.get_xticklabels(minor=True), visible=True) 

... लेकिन यह चाल नहीं किया।

+0

कभी नहीं (इस कारण मेरी matplotlibrctext.usetex:False का उपयोग करके किया जा सकता है) मेरी करीबी वोट, सवाल को बहुत गलत पढ़ा। यदि आपके ग्राफ पर कोई बड़ी लॉग टिक्स नहीं है, तो शायद आपको लॉग स्केल का उपयोग नहीं करना चाहिए। – tacaswell

+2

@tcaswell यह सच नहीं है: यदि आपके पास कोई ऐसा कार्य है जो पावर लॉ (संभवतः कुछ छोटी सुविधा के साथ) के करीब है, तो आप छोटी श्रेणियों के साथ लॉग स्केल का भी उपयोग करना चाहते हैं। फिर एक लॉग प्लॉट में प्रमुख टिक 10 की शक्ति में हैं, इसलिए आपके पास एक रेंज [2000, 9 000] हो सकती है और कोई बड़ी टिक –

+1

मैंने सोचा था। मेरे पास हजारों अंक सभी केंद्रित (बहुत कम स्कैटर के साथ) एक मूल्य के आसपास 10 की किसी भी शक्ति के करीब नहीं हो सकते हैं और फिर भी एक्स अक्ष में लॉग स्केल लागू करना चाहते हैं। –

उत्तर

5

मैं लॉग भूखंडों में ठीक से काम कर ticks नाबालिग प्राप्त करने के लिए कई तरह से कोशिश की है। यदि आप टिक के मूल्य का लॉग दिखाने के साथ ठीक हैं तो आप matplotlib.ticker.LogFormatterExponent का उपयोग कर सकते हैं। मुझे matplotlib.ticker.LogFormatter की कोशिश याद है, लेकिन मुझे यह पसंद नहीं आया: अगर मुझे अच्छी तरह याद है तो यह सबकुछ base^exp (0.1, 0, 1) में भी रखता है। दोनों मामलों में (साथ ही साथ अन्य सभी matplotlib.ticker.LogFormatter*) आपको मामूली टिक प्राप्त करने के लिए labelOnlyBase=False सेट करना होगा।

मैं एक कस्टम फ़ंक्शन बनाने और matplotlib.ticker.FuncFormatter का उपयोग समाप्त कर दिया। मेरा दृष्टिकोण मानता है कि टिक पूर्णांक मानों पर हैं और आप आधार 10 लॉग चाहते हैं।

from matplotlib import ticker 
import numpy as np 

def ticks_format(value, index): 
    """ 
    get the value and returns the value as: 
     integer: [0,99] 
     1 digit float: [0.1, 0.99] 
     n*10^m: otherwise 
    To have all the number of the same size they are all returned as latex strings 
    """ 
    exp = np.floor(np.log10(value)) 
    base = value/10**exp 
    if exp == 0 or exp == 1: 
     return '${0:d}$'.format(int(value)) 
    if exp == -1: 
     return '${0:.1f}$'.format(value) 
    else: 
     return '${0:d}\\times10^{{{1:d}}}$'.format(int(base), int(exp)) 

subs = [1.0, 2.0, 3.0, 6.0] # ticks to show per decade 
ax.xaxis.set_minor_locator(ticker.LogLocator(subs=subs)) #set the ticks position 
ax.xaxis.set_major_formatter(ticker.NullFormatter()) # remove the major ticks 
ax.xaxis.set_minor_formatter(ticker.FuncFormatter(ticks_format)) #add the custom ticks 
#same for ax.yaxis 

आप प्रमुख टिक नहीं निकालते हैं और subs = [2.0, 3.0, 6.0] का उपयोग बड़ी और छोटी टिक का फ़ॉन्ट आकार अलग है मन

+2

होना अच्छा लगेगा यह फ़ंक्शन लॉगरिदमिक टिक-मार्क लेबल के लिए अच्छा स्वरूपण प्राप्त करने का एक शानदार दृष्टिकोण है! महान पद! –

11

आप इसी धुरी पर set_minor_tickformatter उपयोग कर सकते हैं:

from matplotlib import pyplot as plt 
from matplotlib.ticker import FormatStrFormatter 

axes = plt.subplot(111) 
axes.loglog([3,4,7], [2,3,4]) 
axes.xaxis.set_minor_formatter(FormatStrFormatter("%.2f")) 
plt.xlim(1.8, 9.2) 
plt.show() 

enter image description here

संबंधित मुद्दे