特に軸の設定で、matplotlib に本当に苦労しています。私の目標は、1 つの図に 6 つのサブプロットを設定することです。これらはすべて異なるデータセットを表示しますが、目盛ラベルの数は同じです。
ソースコードの関連部分は次のようになります。
グラフ4.py:
# Import Matolotlib Modules #
import matplotlib as mpl
from matplotlib.figure import Figure
from matplotlib.backends.backend_gtkagg import FigureCanvasGTKAgg as FigureCanvas
from matplotlib import ticker
import matplotlib.pyplot as plt
mpl.rcParams['font.sans-serif']='Arial' #set font to arial
# Import GTK Modules #
import gtk
#Import System Modules #
import sys
# Import Numpy Modules #
from numpy import genfromtxt
import numpy
# Import Own Modules #
import mysubplot as mysp
class graph4():
weekdays = ['Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag']
def __init__(self, graphview):
#create new Figure
self.figure = Figure(figsize=(100,100), dpi=75)
#create six subplots within self.figure
self.subplot = []
for j in range(6):
self.subplot.append(self.figure.add_subplot(321 + j))
self.__conf_subplots__() #configure title, xlabel, ylabel and grid of all subplots
#to make it look better
self.figure.subplots_adjust(left=0.125, bottom=0.1, right=0.9, top=0.96, wspace=0.2, hspace=0.6)
#Matplotlib <-> GTK
self.canvas = FigureCanvas(self.figure) # a gtk.DrawingArea
self.canvas.set_flags(gtk.HAS_FOCUS|gtk.CAN_FOCUS)
self.canvas.grab_focus()
self.canvas.show()
graphview.pack_start(self.canvas, True, True)
#add labels and grid to all subplots
def __conf_subplots__(self):
index = 0
for i in self.subplot:
mysp.conf_subplot(i, 'Zeit', 'Menge', graph4.weekdays[index], True)
i.plot([], [], 'bo') #empty plot
index +=1
def plot(self, filename_list):
index = 0
for filename in filename_list:
data = genfromtxt(filename, delimiter=',') #load data from filename
if data.size != 0: #only if file isn't empty
if index <= len(self.subplot): #plot every file on a different subplot
mysp.plot(self.subplot[index],data[0:, 1], data[0:, 0])
index +=1
self.canvas.draw()
def clear_plot(self):
#clear axis of all subplots
for i in self.subplot:
i.cla()
self.__conf_subplots__()
mysubplot.py: (ヘルパー モジュール)
# Import Matplotlib Modules
from matplotlib.axes import Subplot
import matplotlib.dates as md
import matplotlib.pyplot as plt
# Import Own Modules #
import mytime as myt
# Import Numpy Modules #
import numpy as np
def conf_subplot(subplot, xlabel, ylabel, title, grid):
if(xlabel != None):
subplot.set_xlabel(xlabel)
if(ylabel != None):
subplot.set_ylabel(ylabel)
if(title != None):
subplot.set_title(title)
subplot.grid(grid)
#rotate xaxis labels
plt.setp(subplot.get_xticklabels(), rotation=30, fontsize=12)
#display date on xaxis
subplot.xaxis.set_major_formatter(md.DateFormatter('%H:%M:%S'))
subplot.xaxis_date()
def plot(subplot, x, y):
subplot.plot(x, y, 'bo')
何が問題なのかを説明する最善の方法は、スクリーンショットを使用することだと思います. アプリケーションを起動すると、すべてがうまくいきます。
左側の「週」エントリをダブルクリックするとclear_plot()
、graph4.pyのメソッドが呼び出され、すべてのサブプロットがリセットされます。次に、ファイル名のリストがgraph4.pyplot()
のメソッドに渡されます。メソッドは各ファイルを開き、各データセットを異なるサブプロットにプロットします。したがって、エントリをダブルクリックすると、次のようになります。plot()
ご覧のとおり、各サブプロットにはさまざまな数の xtick ラベルがあり、これはかなり見苦しく見えます。したがって、これを改善するための解決策を探しています。xaxis.set_ticklabels()
私の最初のアプローチは、各サブプロットが同じ数の目盛りラベルを持つように、手動で目盛りラベルを設定することでした。ただし、奇妙に聞こえるかもしれませんが、これは一部のデータセットでのみ機能し、その理由は本当にわかりません。一部のデータセットではすべてが正常に機能し、他のデータセットでは、matplotlib は基本的に必要なことを行っており、指定しなかった xaxis ラベルを表示します。も試しFixedLocator()
ましたが、同じ結果になりました。一部のデータセットでは機能しており、他のデータセットでは、matplotlib は異なる数の xtick ラベルを使用しています。
私は何を間違っていますか?
編集:
@sgpc が示唆したように、pyplot を使用しようとしました。私のソースコードは次のようになります。
import matplotlib as mpl
import matplotlib.pyplot as plt
from matplotlib.backends.backend_gtkagg import FigureCanvasGTKAgg as FigureCanvas
import matplotlib.dates as md
mpl.rcParams['font.sans-serif']='Arial' #set font to arial
import gtk
import sys
# Import Numpy Modules #
from numpy import genfromtxt
import numpy
# Import Own Modules #
import mysubplot as mysp
class graph2():
weekdays = ['Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag']
def __init__(self, graphview):
self.figure, temp = plt.subplots(ncols=2, nrows=3, sharex = True)
#2d array -> list
self.axes = [ y for x in temp for y in x]
#axis: date
for i in self.axes:
i.xaxis.set_major_formatter(md.DateFormatter('%H:%M:%S'))
i.xaxis_date()
#make space and rotate xtick labels
self.figure.autofmt_xdate()
#Matplotlib <-> GTK
self.canvas = FigureCanvas(self.figure) # a gtk.DrawingArea
self.canvas.set_flags(gtk.HAS_FOCUS|gtk.CAN_FOCUS)
self.canvas.grab_focus()
self.canvas.show()
graphview.pack_start(self.canvas, True, True)
def plot(self, filename_list):
index = 0
for filename in filename_list:
data = genfromtxt(filename, delimiter=',') #get dataset
if data.size != 0: #only if file isn't empty
if index < len(self.axes): #print each dataset on a different subplot
self.axes[index].plot(data[0:, 1], data[0:, 0], 'bo')
index +=1
self.canvas.draw()
#not yet implemented
def clear_plot(self):
pass
いくつかのデータセットをプロットすると、次の出力が得られます: http://i.imgur.com/3ngYTNr.png (申し訳ありませんが、画像を埋め込むにはまだ十分な評判がありません)
さらに、すべてのサブプロットで x 値が異なる可能性があるため、x 軸を共有することが本当に良いアイデアであるかどうかはよくわかりません (たとえば、最初のサブプロットでは、x 値の範囲は午前 8:00 からです)。 - 午前 11 時、2 番目のサブプロットでは、x 値の範囲は午後 7 時から午後 9 時です)。
を取り除くとsharex = True
、次の出力が得られます。
http://i.imgur.com/rxHeSyJ.png (申し訳ありませんが、写真を埋め込むにはまだ十分な評判がありません)
ご覧のとおり、出力の見栄えが良くなりました。ただし、現在、x 軸のラベルは更新されていません。これは、最後の suplots が空であるためだと思います。
私の次の試みは、各サブプロットに軸を使用することでした。したがって、次の変更を行いました。
for i in self.axes:
plt.setp(i.get_xticklabels(), visible=True, rotation = 30) #<-- I added this line...
i.xaxis.set_major_formatter(md.DateFormatter('%H:%M:%S'))
i.xaxis_date()
#self.figure.autofmt_xdate() #<--changed this line
self.figure.subplots_adjust(left=0.125, bottom=0.1, right=0.9, top=0.96, wspace=0.2, hspace=0.6) #<-- and added this line
これで、次の出力が得られます。
i.imgur.com/TmA1goE.png (申し訳ありませんが、写真を埋め込むにはまだ十分な評判がありません)
Figure()
したがって、この試みでは、基本的に とと同じ問題に苦しんでいadd_subplot()
ます。
私は本当に知りません、それを機能させるために他に何ができるでしょうか...