2012-04-16 10 views
21

में एक कारक द्वारा प्लॉट स्केल बदलना मैं अजगर में एक साजिश बना रहा हूं। क्या एक कारक द्वारा धुरी को फिर से स्केल करने का कोई तरीका है? yscale और xscale आदेश केवल मुझे लॉग स्केल बंद करने की अनुमति देते हैं।matplotlib

संपादित करें:
उदाहरण के लिए। अगर मेरे पास एक प्लॉट है जहां x स्केल 1 एनएम से 50 एनएम तक चला जाता है, तो एक्स स्केल 1x10^(- 9) से 50x10^(- 9) तक होगा और मैं इसे 1 से 50 तक बदलना चाहता हूं। इस प्रकार, मैं 10 से भूखंड पर रखा एक्स मूल्यों को विभाजित करने के^भूखंड समारोह चाहते हैं (- 9)

+4

यॉटम, आपको लगता है कि कई प्रश्न हैं जो उत्तर दिए गए हैं लेकिन आपने अभी तक जवाब स्वीकार नहीं किया है। कृपया पुराने प्रश्नों के लिए उत्तर स्वीकार करें या अतिरिक्त जानकारी जोड़ें ताकि हम आपकी मदद कर सकें! – Hooked

उत्तर

10

टिकों को बदलने के बजाय, इकाइयों को क्यों न बदलें? एक्स-वैल्यू का एक अलग सरणी X बनाएं जिनकी इकाइयां एनएम में हैं। इस तरह, जब आप डेटा प्लॉट करते हैं तो यह पहले से ही सही प्रारूप में है! बस सुनिश्चित करें कि आप इकाइयों को इंगित करने के लिए xlabel जोड़ें (जो हमेशा वैसे भी किया जाना चाहिए)।

from pylab import * 

# Generate random test data in your range 
N = 200 
epsilon = 10**(-9.0) 
X = epsilon*(50*random(N) + 1) 
Y = random(N) 

# X2 now has the "units" of nanometers by scaling X 
X2 = (1/epsilon) * X 

subplot(121) 
scatter(X,Y) 
xlim(epsilon,50*epsilon) 
xlabel("meters") 

subplot(122) 
scatter(X2,Y) 
xlim(1, 50) 
xlabel("nanometers") 

show() 

enter image description here

+0

यही वह है जो मैं अभी करना चाहता हूं। मैंने सोचा कि वहाँ और अधिक सुरुचिपूर्ण तरीका है। – Yotam

5

x- अक्ष की सीमा निर्धारित करने के लिए, आप set_xlim(left, right) उपयोग कर सकते हैं, here are the docs

अद्यतन:

ऐसा लगता है कि आप एक समान साजिश चाहते हैं, लेकिन केवल 'टिक मान' को बदलें, आप टिक मान प्राप्त करके ऐसा कर सकते हैं और फिर उन्हें जो कुछ भी चाहते हैं उसे बदल सकते हैं। तो आपकी ज़रूरत के लिए यह इस तरह होगा:

ticks = your_plot.get_xticks()*10**9 
your_plot.set_xticklabels(ticks) 
+0

मेरी समझ के लिए, xlim साजिश की सीमा को बदलता है और इसे स्केल नहीं करता है। मेरा उदाहरण देखें। – Yotam

+0

@ यॉटम - तो क्या आप साजिश समान होना चाहते हैं, लेकिन एक्स स्केल लेबल पर मान बदल जाएंगे? – fraxel

+0

आश्चर्यजनक रूप से सरल समाधान। हालांकि, मुझे लगता है कि यह एक टिकर का उपयोग करते समय भी दशमलव के साथ लेबल में परिणाम देता है जो केवल पूर्णांक प्रदर्शित करना चाहिए (उदाहरण के लिए एकाधिक लोकेटर या मैक्सनोकेटर)। मैंने पाया कि इसे 'ticks 'के बजाय' ticks.astype (int)' का उपयोग करके हल किया जा सकता है। –

40

आपने गौर किया है, xscale और yscale एक सरल रैखिक फिर से स्केलिंग (दुर्भाग्य से) का समर्थन नहीं करता। झुका के जवाब के लिए एक विकल्प के रूप में, बजाय डेटा के साथ खिलवाड़ की, आप लेबल तो जैसे चाल कर सकते हैं:

ticks = ticker.FuncFormatter(lambda x, pos: '{0:g}'.format(x*scale)) 
ax.xaxis.set_major_formatter(ticks) 

एक पूरा उदाहरण दोनों x और y स्केलिंग दिखा:

import numpy as np 
import pylab as plt 
import matplotlib.ticker as ticker 

# Generate data 
x = np.linspace(0, 1e-9) 
y = 1e3*np.sin(2*np.pi*x/1e-9) # one period, 1k amplitude 

# setup figures 
fig = plt.figure() 
ax1 = fig.add_subplot(121) 
ax2 = fig.add_subplot(122) 
# plot two identical plots 
ax1.plot(x, y) 
ax2.plot(x, y) 

# Change only ax2 
scale_x = 1e-9 
scale_y = 1e3 
ticks_x = ticker.FuncFormatter(lambda x, pos: '{0:g}'.format(x/scale_x)) 
ax2.xaxis.set_major_formatter(ticks_x) 

ticks_y = ticker.FuncFormatter(lambda x, pos: '{0:g}'.format(x/scale_y)) 
ax2.yaxis.set_major_formatter(ticks_y) 

ax1.set_xlabel("meters") 
ax1.set_ylabel('volt') 
ax2.set_xlabel("nanometers") 
ax2.set_ylabel('kilovolt') 

plt.show() 

और अंत में मेरे पास है एक तस्वीर के लिए क्रेडिट:

Left: ax1 no scaling, right: ax2 y axis scaled to kilo and x axis scaled to nano

ध्यान दें कि, यदि आप text.usetex: true है के रूप में मैं है, तो आप ला संलग्न कर सकते हैं $ में बेल्स, जैसे: '${0:g}$'

+0

यह शायद अधिक सही उत्तर है। धन्यवाद @oystein – oche

+0

यह हैक हमें चाहिए –