簡體   English   中英

Matplotlib:堆疊水平條形圖的x軸上的格式化時間

[英]Matplotlib: Formatting time on x-axis of stacked horizontal bar graph

我正在嘗試使用matplotlib在堆疊的水平條形圖中繪制用戶在不同任務上花費的時間。 x軸是時間。 條形圖的每個部分代表在任務上花費的時間。 但是,我得到了格式不正確的意外圖形。 圖形的格式要求我將圖形放大得很遠才能看到所有條形圖。

該圖確實類似於我需要的圖,但起初它看起來像這樣: 原始圖

為了得到這個,我必須放大很遠: 放大圖

除了第一個和最后一個數據點之外,放大的圖似乎具有正確的條形比例。

我的數據是timedelta對象的列表,因此可以將它們添加在一起。 我將它們轉換為datetime對象以圖形化數據。

給我不想要的結果的代碼是:

import matplotlib.pyplot as plt
from datetime import datetime
from datetime import timedelta
import matplotlib.dates as dt

def sum_times(data, N):
    '''sums the first N datetime elements in a list
       changes from timedelta object to datetime object
    '''
    # initialize
    summ = datetime(1900, 1, 1, 0, 0, 0)
    for i in range(len(data[0:N])):
        summ += data[i]
    return summ

start_date = datetime(1900, 1, 1, 0, 0, 0)
times = [timedelta(0, 737), 
         timedelta(0, 110), 
         timedelta(0, 356), 
         timedelta(0, 171), 
         timedelta(0, 306)]

fig, ax1 = plt.subplots(1,1, sharex=True, sharey=True)

ax1.set_title("Bug being fixed")
ax1.set_xlabel('time')
ax1.xaxis_date()

# the graph uses datetime objects
ax1.barh(1, times[0] + start_date)
ax1.barh(1, times[1] + start_date, left=sum_times(times, 1))
ax1.barh(1, times[2] + start_date, left=sum_times(times, 2))
ax1.barh(1, times[3] + start_date, left=sum_times(times, 3))
ax1.barh(1, times[4] + start_date, left=sum_times(times, 4))

ax1.set_xticks(range(1,10))   # arbitrary 

plt.show()

我該怎么做才能改變格式?

我曾嘗試將ax1.set_xticklabels()datetimetimedelta對象一起使用,但出現異常: ValueError: ordinal must be >= 1

當我使用

ax1.xaxis.set_major_locator(dt.MinuteLocator(interval=60))
ax1.xaxis.set_major_formatter(dt.DateFormatter('%M:%S'))

格式仍然不正確。

我正在使用python 3.6,matplotlib,PyDev IDE和Windows 8。

如果有任何更適合顯示此類數據的庫或可以補充matplotlib / pyplot的庫,則不勝感激。

另外,我嘗試使用循環來自動執行對ax1.barh(...)的調用,但是圖形窗口不會顯示並且變得無響應。 由於我想繪制更大的數據集,因此我可以使用更優雅的解決方案。

在提供@rvd的建議的基礎上,我提出了使用熊貓的更好解決方案。 就格式而言,它仍然不是理想的選擇,但是我不需要花太多的力氣就能看到我的圖並且數據是成比例的。

這是使用pandas使其工作更好的代碼:

import pandas as pd
import matplotlib.pyplot as plt
from datetime import datetime
from datetime import timedelta
import matplotlib.dates as dt

times = [timedelta(0, 737), 
         timedelta(0, 110), 
         timedelta(0, 356), 
         timedelta(0, 171), 
         timedelta(0, 306)]

start_date = datetime(1900, 1, 1, 0, 0, 0)
times_datetime = [start_date + times[i] for i in range(len(times))]
# pandas requires numerical data on dependent axis
times_num = dt.date2num(times_datetime)
# to make times_num proportionally correct
for i in range(len(times_num)):
    times_num[i] -= dt.date2num(start_date)

df = pd.DataFrame([times_num], index=['bugs'])
fig, ax1 = plt.subplots(1,1, sharex=True, sharey=True)
df.plot(kind='barh', ax=ax1, stacked=True)
plt.show()

這產生了: 更好的圖

x軸刻度可能不是時間,但是數據可視化更像是我要尋找的東西。

謝謝!

在Python中使用pandas庫可能會派上用場,因為對時間序列分析和繪圖的支持比在matplotlib (基於該庫的基礎上)更加原生和直觀。 如果你有一個CSV文件的形式數據,將數據加載到使用數據幀df = pandas.read_csv(FILEPATH)和與積df.plot() 如果您要查找更復雜或響應更快的圖,請一定要查看Plotly-您只需將庫導入python並制作時間序列的響應圖即可,而且非常簡單。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM