Matplotlib-də x və ya y axisində "gənci" nin tezliyini dəyişdirmək?

Python mənim məlumatlarımı necə göstərdiyini müəyyən etməyə çalışıram.

Söylə mənə

 x = [0,5,9,10,15] 

 y = [0,1,2,3,4] 

Sonra bunu edərdim:

 matplotlib.pyplot.plot(x,y) matplotlib.pyplot.show() 

x-oxunun gənci 5 intervalında göstərilir. 1-i aralar göstərmək üçün bir yol varmı?

208
26 сент. Dax Feliz tərəfindən təyin olunan 26 sentyabr. 2012-09-26 22:12 '12 at 10:12 pm 2012-09-26 22:12
@ 9 cavab

plt.xticks ilə qeyd etmək istədiyiniz yerləri açıq şəkildə göstərə bilərsiniz:

 plt.xticks(np.arange(min(x), max(x)+1, 1.0)) 

Məsələn,

 import numpy as np import matplotlib.pyplot as plt x = [0,5,9,10,15] y = [0,1,2,3,4] plt.plot(x,y) plt.xticks(np.arange(min(x), max(x)+1, 1.0)) plt.show() 

( np.arange yalnız min(x)max(x) halda Python range funksiyası yerinə istifadə np.arange - bu, ints-də bir float deyil.)


plt.plot (və ya ax.plot ) funksiyası avtomatik olaraq xy standartlarını təyin plt.plot . Bu məhdudiyyətləri saxlamaq və etiket parametrini dəyişdirmək istəyirsinizsə, ax.get_xlim() istifadə edə bilərsiniz Matplotlib artıq müəyyən məhdudiyyətlər tapmaq üçün.

 start, end = ax.get_xlim() ax.xaxis.set_ticks(np.arange(start, end, stepsize)) 

Varsayılmayan kəllə kilidi dəyərli bir iş etməli, gənə dəyərlərini bir çox əhəmiyyətli rəqəmə uyğunlaşdırmalıdır. Lakin, format üzərində daha çox nəzarət istəyirsinizsə, öz formatterinizi təyin edə bilərsiniz. Məsələn,

 ax.xaxis.set_major_formatter(ticker.FormatStrFormatter('%0.1f')) 

Burada bir nümunə:

 import numpy as np import matplotlib.pyplot as plt import matplotlib.ticker as ticker x = [0,5,9,10,15] y = [0,1,2,3,4] fig, ax = plt.subplots() ax.plot(x,y) start, end = ax.get_xlim() ax.xaxis.set_ticks(np.arange(start, end, 0.712123)) ax.xaxis.set_major_formatter(ticker.FormatStrFormatter('%0.1f')) plt.show() 
268
26 сент. Cavab verilir . 2012-09-26 22:24 '12 at 10:24 pm 2012-09-26 22:24

Digər bir yanaşma eksen axtarışını təyin etməkdir:

 import matplotlib.ticker as plticker loc = plticker.MultipleLocator(base=1.0) # this locator puts ticks at regular intervals ax.xaxis.set_major_locator(loc) 

Sizin ehtiyaclarınıza bağlı olaraq, bir neçə müxtəlif növ axtarışçı var.

92
14 нояб. Cavab 14 fevral 2013- cü il tarixdə verilmişdir. 2013-11-14 11:38 '13 at 11:38 2013-11-14 11:38

Mən bu həllini sevirəm ( Matplotlib Cookbook- dan):

 import matplotlib.pyplot as plt import matplotlib.ticker as ticker x = [0,5,9,10,15] y = [0,1,2,3,4] tick_spacing = 1 fig, ax = plt.subplots(1,1) ax.plot(x,y) ax.xaxis.set_major_locator(ticker.MultipleLocator(tick_spacing)) plt.show() 

Bu həlli ticker.MultipleLocater() göstərilən ticker.MultipleLocater() görə gənə aralığının dəqiq bir nəzarətini verir, avtomatik olaraq limit dəyərlərini müəyyən etməyə və asanlıqla oxumağa imkan verir.

47
26 марта '16 в 2:24 2016-03-26 02:24 26-cı il mayın 16-da, 2 : 02-citom tərəfindən verilən cavab 2016-03-26 02:24

Birisi ümumi bir xətt sahəsi ilə maraqlanırsa, sadəcə mövcud ticksləri əldə edin və bütün digər onay qutularını nümunələşdirməklə yeni ticlər qurmaq üçün istifadə edin.

 ax.set_xticks(ax.get_xticks()[::2]) 
26
15 апр. cavab 15 ay apreldir . 2016-04-15 14:46 '16 saat 2:46 'da 2016-04-15 14:46

Bu bir az hacked, amma mütləq bunun üçün tapdığım nümunəni anlamaq üçün ən təmiz / asan. Bura buradan gələn cavab:

Matplotlib rəng çubuğunda hər bir n-ci sətirinin gizlənməsinin ən açıq yolu nədir?

 for label in ax.get_xticklabels()[::2]: label.set_visible(False) 

Daha sonra etiketlər arasında gezinerek, onları istədiyiniz və ya istədiyiniz sıxlıqdan bağımsız olaraq ayarlayabilirsiniz.

redaktə: bəzən matplotlib yazıları qeyd edir == '' , belə ki etiketin eksik görünə bilər, amma əslində bir şey göstərmir. Həqiqi görünən etiketləri nəzərdən keçirmək üçün əmin ola bilərsiniz:

 visible_labels = [lab for lab in ax.get_xticklabels() if lab.get_visible() is True and lab.get_text() != ''] plt.setp(visible_labels[::2], visible=False) 
19
13 авг. cavab verildi choldgraf 13 aug. 2015-08-13 23:15 '15 at 11:15 pm 2015-08-13 23:15

Bu köhnə bir mövzudur, amma bəzən buna bənzəyirəm və bu funksiyanı yerinə yetirirəm. Bu çox rahatdır:

 import matplotlib.pyplot as pp import numpy as np def resadjust(ax, xres=None, yres=None): """ Send in an axis and I fix the resolution as desired. """ if xres: start, stop = ax.get_xlim() ticks = np.arange(start, stop + xres, xres) ax.set_xticks(ticks) if yres: start, stop = ax.get_ylim() ticks = np.arange(start, stop + yres, yres) ax.set_yticks(ticks) 

Beləliklə, kene nəzarətinə mane olanlardan biri artıq interaktiv avtomatik yeniləmənin maksimumu kimi deyil. əlavə satırdan sonra miqyaslıdır. Sonra bunu

 gca().set_ylim(top=new_top) # for example 

yenidən qurma funksiyasını yenidən başladın.

10
17 дек. Cavab Tompa 17 Dekabr. 2014-12-17 22:18 '14 at 22:18 2014-12-17 22:18

Mən ümidsiz bir həll inkişaf etdirdim. Bir X eksenimiz var, X-də hər bir nöqtə üçün bir etiket siyahısı var.

Məsələn:
 import matplotlib.pyplot as plt x = [0,1,2,3,4,5] y = [10,20,15,18,7,19] xlabels = ['jan','feb','mar','apr','may','jun'] 
Deyək ki, etiketləri yalnız "feb" və "jun" üçün göstərmək istəyirəm,
 xlabelsnew = [] for i in xlabels: if i not in ['feb','jun']: i = ' ' xlabelsnew.append(i) else: xlabelsnew.append(i) 
Bəli, indi bizdə saxta etiket siyahısı var. Əvvəlcə orijinal versiyasını qurduq.
 plt.plot(x,y) plt.xticks(range(0,len(x)),xlabels,rotation=45) plt.show() 
İndi versiya dəyişdi.
 plt.plot(x,y) plt.xticks(range(0,len(x)),xlabelsnew,rotation=45) plt.show() 
6
11 марта '15 в 16:26 2015-03-11 16:26 Cavab Deninhos tərəfindən 11 Mart '15 'də saat 16:26' da verilir
 xmarks=[i for i in range(1,length+1,1)] plt.xticks(xmarks) 

Mənim üçün çalışdı.

Əgər [1.5] (1 və 5 daxil) arasında gənə istəyirsənsə, əvəz et

 length = 5 
1
30 июня '17 в 10:33 2017-06-30 10:33 Cavab Piyuş Gupta tərəfindən 30 İyun tarixində saat 10:33 'də 2017-06-30 10:33' də verilir

Burada pozitiv, mənfi və ya qarışıq dəyərlərlə hər hansı ədədi seriyanı (int və ya float) işləyən istənilən funksiyanı təmiz bir python tətbiq edir:

 def computeTicks (x, step = 5): """ Computes domain with given step encompassing series x @ params x - Required - A list-like object of integers or floats step - Optional - Tick frequency """ import math as Math xMax, xMin = Math.ceil(max(x)), Math.floor(min(x)) dMax, dMin = xMax + abs((xMax % step) - step) + (step if (xMax % step != 0) else 0), xMin - abs((xMin % step)) return range(dMin, dMax, step) 

Nümunə çıxışı:

 # Negative to Positive series = [-2, 18, 24, 29, 43] print(list(computeTicks(series))) [-5, 0, 5, 10, 15, 20, 25, 30, 35, 40, 45] # Negative to 0 series = [-30, -14, -10, -9, -3, 0] print(list(computeTicks(series))) [-30, -25, -20, -15, -10, -5, 0] # 0 to Positive series = [19, 23, 24, 27] print(list(computeTicks(series))) [15, 20, 25, 30] # Floats series = [1.8, 12.0, 21.2] print(list(computeTicks(series))) [0, 5, 10, 15, 20, 25] # Step – 100 series = [118.3, 293.2, 768.1] print(list(computeTicks(series, step = 100))) [100, 200, 300, 400, 500, 600, 700, 800] 

Istifadə nümunəsi:

 import matplotlib.pyplot as plt x = [0,5,9,10,15] y = [0,1,2,3,4] plt.plot(x,y) plt.xticks(computeTicks(x)) plt.show() 
0
28 июля '17 в 23:55 2017-07-28 23:55 Cavab Greenstick tərəfindən iyul ayının 28-də saat 17 : 57- də 2017-07-28 23:55 tarixində verilir