2012-11-16 6 views
7

मैं x- अक्ष पर टिक का मान बदलने के लिए कोशिश कर रहा हूँ एक imshow साजिश निम्नलिखित कोड का उपयोग कर:इमशो का उपयोग करते समय कस्टम टिक ऑटोस्केल्ड?

import matplotlib.pyplot as plt 
import numpy as np 

def scale_xaxis(number): 
    return(number+1001) 

data = np.array([range(10),range(10,20)]) 
fig = plt.figure(figsize=(3,5)) 
ax = fig.add_subplot(111) 
ax.imshow(data,aspect='auto') 
ax.autoscale(False) 
xticks = ax.get_xticks() 
ax.xaxis.set_ticklabels(scale_xaxis(xticks)) 
plt.savefig("test.png") 

Resulting image http://ubuntuone.com/2Y5ujtlEkEnrlTcVUxvWLU

हालांकि एक्स-टिक ओवरलैप और "गैर दौर" है मान। Matplotlib स्वचालित रूप से ऐसा करने के लिए कोई तरीका है? या तो set_ticklabels या किसी अन्य तरीके से उपयोग करके?

उत्तर

6

इसके अलावा extent(doc) का उपयोग कर matplotlib कैसे टिक लेबल में डाल दिया और एक मनमाना पाली में जोड़ने के लिए के बारे में सब सोच कर यह बताने के लिए इस पर गौर:

data = np.array([range(10),range(10,20)]) 
fig = plt.figure(figsize=(3,5)) 
ax = fig.add_subplot(111) 
ax.imshow(data,aspect='auto',extent=[10000,10010,0,1]) 

आप निश्चित रूप से यह करने के लिए मेरे हाथ करना चाहते हैं, आप (doc) प्राप्त करने के लिए axis के formatter और locator को सेट करने से बेहतर हो सकता है।

import matplotlib.pyplot as plt 
import numpy as np 

def scale_xaxis(number): 
    return(number+1001) 

def my_form(x,pos): 
    return '%d'%scale_xaxis(x) 

data = np.array([range(10),range(10,20)]) 
fig = plt.figure(figsize=(3,5)) 
ax = fig.add_subplot(111) 
ax.imshow(data,aspect='auto') 
ax.autoscale(False) 
ax.xaxis.set_major_locator(matplotlib.ticker.MultipleLocator(int(2))) 
ax.xaxis.set_major_formatter(matplotlib.ticker.FuncFormatter(my_form)) 

लोकेटर सुनिश्चित करें कि टिक गैर पूर्णांक स्थानों जो संरूपक द्वारा पूर्णांकों को तो जबरन डाली हैं (जो उन्हें गलत जगह पर छोड़ जाएगा)

पर डाल नहीं मिलता बनाने के लिए निर्धारित करने की आवश्यकता

संबंधित प्रश्नों:

matplotlib: format axis offset-values to whole numbers or specific number

removing leading 0 from matplotlib tick label formatting

+0

इस विशिष्ट समस्या के लिए काम करता है, और जवाब वें ई प्रश्न मैंने पूछा (पीछे की ओर देखकर मैं देखता हूं कि मैंने अपने प्रश्न को खराब तरीके से phrased किया)।लेकिन यह वास्तव में मेरी मुख्य समस्या को हल नहीं करता है: मुझे उचित संख्या में टिकों का चयन करने के लिए matplotlib बनाने के लिए कुछ तरीका चाहिए। उदाहरण के लिए यदि वापसी (संख्या + 1001) वापसी थी (संख्या + 10001)। फिर मैं matplotlib को ओवरलैप से बचने के लिए स्वचालित रूप से टिकों की सही संख्या का चयन कैसे कर सकता हूं? क्या मुझे जवाब स्वीकार करना चाहिए और एक नया प्रश्न बनाना चाहिए, या क्या मुझे इस प्रश्न को संपादित करना चाहिए? – Magnus

+0

@Magnus संपादित करें – tacaswell

+0

'सीमा' का उपयोग करके इसे हल किया गया, धन्यवाद! – Magnus

2

ऐसा करने के कई तरीके हैं।

आप कर सकते हैं:

तैरता की एक सरणी ints की एक सरणी के बजाय में
  1. पास स्वरूपित तार
  2. उपयोग की एक सरणी में
  3. पास एक कस्टम टिक फ़ॉर्मेटर

आखिरी विकल्प इस सरल के लिए ओवरकिल है।

पहला विकल्प का एक उदाहरण के रूप में, आप अपने scale_xaxis समारोह को बदल देंगे कुछ इस तरह होना करने के लिए: कि क्या आप ax.get_xticks से बाहर हो रही है एक एकल के बजाय एक numpy सरणी है

def scale_xaxis(numbers): 
    return numbers.astype(int) + 1001 

नोट मूल्य। इस प्रकार, हमें के बजाय number.astype(int) करने की आवश्यकता है।

वैकल्पिक रूप से, हम स्वरूपित तारों की एक श्रृंखला वापस कर सकते हैं। set_xticklabels वास्तव में उम्मीद तार का एक अनुक्रम:

def scale_xaxis(numbers): 
    return ['{:0.0f}'.format(item + 1001) for item in numbers] 

एक कस्टम टिक फ़ॉर्मेटर का उपयोग overkill यहाँ है, इसलिए मैं पल के लिए इसे बाहर छोड़ देंगे। हालांकि, यह सही स्थिति में काफी आसान है।

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