是否有可视化大量子图(> 500)的好方法?
Is there a good way to visualize large number of subplots (> 500)?
我仍在处理我的纽约地铁数据。我以这样的方式清理和整理数据,现在每个站点每小时 'Average Entries' 和 'Average Exits'(范围从 0 到 23)在周末和工作日分开(类别变量有两个可能的值:weekend/weekday).
我想做的是创建一个图,每个站都是一行,每行有两列(第一列用于工作日,第二列用于周末)。我想每小时绘制 'Average Entries' 和 'Average Exits' 以获取有关站点的一些信息。这里有两件事很有趣;首先是纯粹的数字,表明一个车站有多忙;其次是给定时间进出站之间的比率,以表明车站是生活区(早上进站负荷,晚上出站负荷)还是工作区(早上出站负荷,进站负荷)大约在下午 4 点、下午 6 点和晚上 8 点左右偷看)。唯一的问题,大约有550个站。
我尝试用 seaborn facetgrid 绘制它,如果没有 运行 内存问题,它无法处理超过几个站(10 个左右)。
所以我想知道是否有人有好主意来完成我正在尝试做的事情。
请找到随附的笔记本(倒数第二个单元格显示我对数据可视化的尝试,即 4 个站点的绘图)。这显然不适用于 500 多个站点,所以可能是连续 5 个站点?
最后一个单元格包含评论中要求的站 R001 的数据..
https://github.com/FBosler/Udacity/blob/master/Example.ipynb
非常感谢任何意见!
法比安
除非你有一整面显示器,否则无论你做什么,你都将无法在屏幕上显示它们,但是为了绕过内存限制,你可以将它们光栅化并保存到图像文件(我建议使用 .png 来压缩具有几种不同颜色的图像)
你想要的是 pyplot.savefig()
Here's 关于如何做到这一点的另一个问题的答案,以及一些提示和技巧
而不是制作 550 多个子图,看看你是否可以制作两个大的 numpy 数组,然后使用 2 个 imview
个子图,一个用于工作日,一个用于周末
对于 y 值,首先找到平均值的最小值 (0) 和最大值 (10,000?),缩放它们以适合每个假行,例如 10px,然后将数据中的每一行偏移10px * 行号。
由于您想要为 24 个数据点中的每一个绘制线图,因此您必须在数据点之间以 10px 的增量进行线性插值,以便最终的 numpy 数组为 240 x 5500 x 2.
一种可行的方法是使用每个车站的进出比。每个 day/hour 可以在图像上形成一列,每一行都是一个站。例如:
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()
如果您想显示实际涉及的数字而不是比率,我会考虑将数据分成两部分,每个入口和出口数据集一张图像。然后可以使用每个像素的强度来告知数字,而不是比率。
我仍在处理我的纽约地铁数据。我以这样的方式清理和整理数据,现在每个站点每小时 'Average Entries' 和 'Average Exits'(范围从 0 到 23)在周末和工作日分开(类别变量有两个可能的值:weekend/weekday).
我想做的是创建一个图,每个站都是一行,每行有两列(第一列用于工作日,第二列用于周末)。我想每小时绘制 'Average Entries' 和 'Average Exits' 以获取有关站点的一些信息。这里有两件事很有趣;首先是纯粹的数字,表明一个车站有多忙;其次是给定时间进出站之间的比率,以表明车站是生活区(早上进站负荷,晚上出站负荷)还是工作区(早上出站负荷,进站负荷)大约在下午 4 点、下午 6 点和晚上 8 点左右偷看)。唯一的问题,大约有550个站。
我尝试用 seaborn facetgrid 绘制它,如果没有 运行 内存问题,它无法处理超过几个站(10 个左右)。
所以我想知道是否有人有好主意来完成我正在尝试做的事情。
请找到随附的笔记本(倒数第二个单元格显示我对数据可视化的尝试,即 4 个站点的绘图)。这显然不适用于 500 多个站点,所以可能是连续 5 个站点?
最后一个单元格包含评论中要求的站 R001 的数据..
https://github.com/FBosler/Udacity/blob/master/Example.ipynb
非常感谢任何意见! 法比安
除非你有一整面显示器,否则无论你做什么,你都将无法在屏幕上显示它们,但是为了绕过内存限制,你可以将它们光栅化并保存到图像文件(我建议使用 .png 来压缩具有几种不同颜色的图像)
你想要的是 pyplot.savefig()
Here's 关于如何做到这一点的另一个问题的答案,以及一些提示和技巧
而不是制作 550 多个子图,看看你是否可以制作两个大的 numpy 数组,然后使用 2 个 imview
个子图,一个用于工作日,一个用于周末
对于 y 值,首先找到平均值的最小值 (0) 和最大值 (10,000?),缩放它们以适合每个假行,例如 10px,然后将数据中的每一行偏移10px * 行号。
由于您想要为 24 个数据点中的每一个绘制线图,因此您必须在数据点之间以 10px 的增量进行线性插值,以便最终的 numpy 数组为 240 x 5500 x 2.
一种可行的方法是使用每个车站的进出比。每个 day/hour 可以在图像上形成一列,每一行都是一个站。例如:
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()
如果您想显示实际涉及的数字而不是比率,我会考虑将数据分成两部分,每个入口和出口数据集一张图像。然后可以使用每个像素的强度来告知数字,而不是比率。