是否有一种可视化大量子图(> 500)的好方法?

时间:2016-08-19 12:47:09

标签: python pandas matplotlib visualization subplot

我还在处理纽约地铁数据。我以这样一种方式清理和争论数据:我现在每周小时(从0到23)的“平均条目”和“平均退出”分为周末和工作日(具有两个可能值的类别变量:周末/工作日)。

我想要做的是创建一个情节,每个电台都是一排,每排有两列(第一个用于工作日,第二个用于周末)。我想绘制每小时的“平均条目数”和“平均退出数”来获取有关电台的一些信息。这里有两件值得关注的事情;首先是表明车站有多忙的数字;其次,指定小时的出入口比率,以指示该站是否是一个生活区域(早上的入口负载,晚上的出口负载)或更多的工作区域(早上的出口负载,条目在下午4点,6点和8点左右偷看)。唯一的问题是,大约有550个站点。

我尝试用seaborn facetgrid绘制它,它不能处理多个站点(10个左右),而不会遇到内存问题。

所以我想知道是否有人有一个好主意来完成我想要做的事情。

请附上一个笔记本(倒数第二个单元显示我尝试可视化数据,即4个工作站的绘图)。这显然不适用于500多个电台,所以可能连续5个电台?

最后一个单元格包含评论中要求的Station R001数据。

https://github.com/FBosler/Udacity/blob/master/Example.ipynb

任何输入都非常感谢! 费边

3 个答案:

答案 0 :(得分:2)

而不是制作550多个子图,看看你是否可以创建两个大的numpy数组,然后使用2个imview子图,一个用于工作日,一个用于周末

对于y值,首先找到平均值的min(0)和max(10,000?),将它们缩放以适合每个假行,例如10px然后将数据中的每一行偏移10px *行号。

因为你想要24个数据点中的每个数据点的线图,你必须在数据点之间进行线性插值,例如10px,这样最终的numpy数组将是240 x 5500 x 2

答案 1 :(得分:1)

除非你有一整面显示器,否则无论你做什么都会在屏幕上显示它们都会出现问题,但为了克服内存限制,你可以光栅化它们并保存到图像文件中(我会建议.png用于压缩性与几种不同颜色的图像)

你想要的是pyplot.savefig()

Here's关于如何做到这一点的另一个问题的答案,有一些提示和技巧

答案 2 :(得分:1)

您可以这样做的一种方法是使用每个站点的出口比率。每天/每小时可以在图像上形成一列,每行可以是一个站。例如:

from matplotlib import pyplot as plt
import random
import numpy as np


all_stations = []

for i in range(550):
    entries = [float(random.randint(0, 50)) for i in range(7*24)] # Data point for each hour over a week
    exits = [float(random.randint(0, 50)) for i in range(7*24)]

    weekend_entries = entries[:2*7]
    weekend_exits = exits[:2*7]

    day_entries = entries[2*7:]
    day_exits = exits[2*7:]

    weekend_ratio = [np.array(en) / np.array(ex) for en, ex in zip(weekend_entries, weekend_exits)]
    day_ratio = [np.array(en) / np.array(ex) for en, ex in zip(day_entries, day_exits)]

    whole_week = weekend_ratio + day_ratio

    all_stations.append(whole_week)

plt.figure()
plt.imshow(all_stations, aspect='auto', interpolation="nearest")
plt.xlabel("Hours")
plt.ylabel("Station number")
plt.title("Entry/exit ratio per station")
plt.colorbar(label="Entry/exit ratio")
# Add some vertical lines to indicate days
for j in range(1, 7):
    plt.plot([j*24]*2, [0, 550], color="black")
plt.xlim(0, 7*24)
plt.ylim(0, 550)
plt.show()

enter image description here

如果您想显示实际数字而不是比率,我会考虑将数据分成两个,每个条目和退出数据集一个图像。然后可以使用每个像素的强度来通知数字,而不是比率。