Как создать один барх сюжет со множеством np.arrays? - PullRequest
0 голосов
/ 05 февраля 2020

Я создаю визуализацию с Python, которая включает tkinter, matplotlib и numpy. Я хотел бы визуализировать несколько numpy массивов в одном барх-сюжете. Так что я могу проанализировать все на этом одном графике. В моем предыдущем коде мне удалось сделать это только с помощью сюжетов. Но мне всегда приходилось комментировать два других сюжета. Можете ли вы помочь мне визуализировать эти шесть numpy массивов (Netflix_Beg / End, Youtube_Beg / End, Vimeo_Beg / End) в одном столбчатом графике?

Желаемый результат должен выглядеть следующим образом. Это я создал с помощью powerpoint и моего предыдущего кода.

Expected Result Ниже приведен мой предыдущий код:

import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk 
import tkinter as tk
import numpy as np

fig, ax = plt.subplots(3, 1, facecolor = "white")

#data
Netflix_Beg = np.array([1,4,500,1500,2800,2960,2700, 5,2000,2000,3100,4000,4150,4150])
Netflix_End = np.array([5,1000,1000,2100,3000,3150,3150, 20,50,600,3500,3800,3960,3700])

Youtube_Beg = np.array([2,5,600,2600,3900,3970,3800, 6,3000,3000,4200,5000,5260,5260])
Youtube_End = np.array([6,2000,2000,3200,4000,4260,4260, 30,60,700,4600,4900,4070,4800])

Vimeo_Beg = np.array([0,3,400,400,1700,1850,1600,4,1000,1000,2000,3000,3040,3040])
Vimeo_End = np.array([4,500,500,1000,2000,2040,2040, 10,40,500,2400,2700,2850,2600])

Netflix = ["Netflix {}".format(i) for i in range(len(Netflix_Beg))]
Ytb = ["Youtube {}".format(i) for i in range(len(Youtube_Beg))]
Vim = ["Vimeo {}".format(i) for i in range(len(Vimeo_Beg))]

#window
root = tk.Tk()
root.title("Overview") 

#plot
Plot_Netflix = plt.barh(range(len(Netflix_Beg)),  Netflix_End-Netflix_Beg+20, 
                    left=Netflix_Beg,
                    color='#BDD7EE')

#Plot_Youtube = plt.barh(range(len(Youtube_Beg)),  Youtube_End-Youtube_Beg+20, 
#                    left=Youtube_Beg,
#                    color='#C5E0B4')
#                    
#Plot_Vimeo = plt.barh(range(len(Vimeo_Beg)),  Vimeo_End-Vimeo_Beg+20, 
#                    left=Vimeo_Beg,
#                    color="red",
#                    alpha=0.5)

plt.yticks(range(len(Netflix_Beg)), Netflix)
#plt.yticks(range(len(Youtube_Beg)), Ytb)
#plt.yticks(range(len(Vimeo_Beg)), Vim)

plt.tight_layout() 

#plot in tkinter window
canvas = FigureCanvasTkAgg(fig, master = root)
canvas.draw()
canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=True)
canvas._tkcanvas.pack(side = tk.TOP, fill = tk.BOTH, expand = True)

#plot toolbar
toolbar = NavigationToolbar2Tk(canvas, root)
toolbar.update()

root.mainloop()

1 Ответ

1 голос
/ 05 февраля 2020

Как это?

#data
Netflix_Beg = np.array([1,4,500,1500,2800,2960,2700, 5,2000,2000,3100,4000,4150,4150])
Netflix_End = np.array([5,1000,1000,2100,3000,3150,3150, 20,50,600,3500,3800,3960,3700])

Youtube_Beg = np.array([2,5,600,2600,3900,3970,3800, 6,3000,3000,4200,5000,5260,5260])
Youtube_End = np.array([6,2000,2000,3200,4000,4260,4260, 30,60,700,4600,4900,4070,4800])

Vimeo_Beg = np.array([0,3,400,400,1700,1850,1600,4,1000,1000,2000,3000,3040,3040])
Vimeo_End = np.array([4,500,500,1000,2000,2040,2040, 10,40,500,2400,2700,2850,2600])

Netflix = ["Netflix {}".format(i) for i in range(len(Netflix_Beg))]
Ytb = ["Youtube {}".format(i) for i in range(len(Youtube_Beg))]
Vim = ["Vimeo {}".format(i) for i in range(len(Vimeo_Beg))]



fig, ax = plt.subplots(figsize=(8,8))

Plot_Netflix = plt.barh(range(len(Netflix_Beg)),  Netflix_End-Netflix_Beg+20, 
                    left=Netflix_Beg,
                    color='#BDD7EE')

Plot_Youtube = plt.barh(len(Netflix_Beg)+np.arange(len(Youtube_Beg)),  Youtube_End-Youtube_Beg+20, 
                   left=Youtube_Beg,
                   color='#C5E0B4')

Plot_Vimeo = plt.barh(len(Netflix_Beg)+len(Youtube_Beg)+np.arange(len(Vimeo_Beg)),  Vimeo_End-Vimeo_Beg+20, 
                   left=Vimeo_Beg,
                   color="red",
                   alpha=0.5)

plt.yticks(range(len(Netflix_Beg)+len(Youtube_Beg)+len(Vimeo_Beg)), Netflix+Ytb+Vim)

plt.tight_layout() 

enter image description here

...