作者 | James Briggs
来源 | Medium
编辑 | 代码医生团队
synthwave是一种独特而独特的音乐流派,其灵感来自1980年代的怀旧风格,是技术人员共同的最爱。喜欢它,并且发现它的艺术风格令人难以置信地令人着迷。
在YouTube上快速搜索该流派可以使任何人都对该流派带来的复古科幻美学感激。
现在很想创建这样的视觉效果。但是每天都在处理数据,既不是动画师,图形设计师也不是艺术家。
然后想:“确实创建了视觉效果,在Matplotlib中可视化了数据。在Matplotlib中创建Synthwave视觉效果不是很有趣吗?” 。
透视
首先要创建的透视图样式是垂直网格线。为此设置了一个原点(0, 5)。线条必须从此处到达框架底部的位置y = -50。每行唯一要更改的值是Numpy linspace函数中的最终x值。使用for循环,范围是从x = -500到x = 500,步长为50。
现在,没有地平线,没有地平线就不可能有无尽的合波之路。因此只需掩盖上述所有y值0使用np.ma.masked_where(y > 0, y)。
最后,修复配色方案。将使用黑色背景,并使用多条半透明线来创建发光效果[1]。
运动
这有点棘手。为了创建似乎朝着水平线,使用Matplotlib动画来不断更新水平线的y位置。创建这些运动线的十个实例,每个实例都分配有一个修改后的指数函数,如下所示:
分别针对零行,四行和八行的Y位置函数。
每个运动线都为每个帧分配相同的x值。但是当沿x轴移动每个函数时,将返回不同的y值。如果绘制所有十条运动线,请牢记此逻辑,可以可视化时间(x轴)到线的y位置(y轴):
通过使用指数函数,将运动线和透视线混合在一起。三维运动的错觉是通过随着运动线“离我们越来越近”而增加向下的速度来产生的。这类似于动画的放松[2]。
将其应用于水平网格线的y位置,给我们一种在霓虹紫色tron tron样的世界中不断前进的幻想。
幸运的是,对于输出文件的大小,运动线的移动每占总时间的十分之一就重复一次。意味着可以在动画功能中将动画帧削减十倍animation.FuncAnimation(fig, animate, frames=int(frames/10))。
迈阿密太阳
如果在无尽的霓虹灯紫色道路尽头没有超大的复古日落,这将不是Synthwave。
当涉及到渐变时,Matplotlib可能会有些困难。imshow()用来创建图像,在例子中是plasma渐变。然后将该图像从中心点遮罩超过指定半径,从而得到:
很好,但还没有到那儿。迈阿密的太阳需要辉光和几条水平线。对于辉光,再放置一些半径稍大且alpha值较低的圆圈。在使用简单的黑色线条图后添加线条。
将迈阿密太阳和霓虹灯网格放在一起,得到:
目的地
无尽的霓虹紫色路需要目的。一个遥远但并非太遥远的目的地。想想-一个神秘的都市天堂。
幸运的是,Matplotlib附带了一个专用的复古天际发电机,名为plt.bar()!只需使用np.random.uniform(0, 10),通过一些计算即可定义条形宽度,而拥有自己的美丽的,随机生成的天际线。
由于看不到天际线轮廓与密云密布的迈阿密夜空相对,从无尽的地平线上散发出深紫色的光芒。将plt.imshow()再次使用。需要的是初始gnuplot渐变,因此采用前28种颜色映射并使用创建新的渐变ListedColormap。
Matplotlib中的 gnuplot颜色图参考
还自由地减少了霓虹灯网格的线宽,认为现在看起来好多了。来看看无尽的道路:
看起来不错,但现在超大的迈阿密日落可能太大了,挤压了遥远天际线的完美视野。另外,80年代的迈阿密天空总是满是星星。
因此调整太阳和添加使用星plt.scatter()用np.random.uniform()的x和y。还alpha基于y位置(朝地平线变暗)和一点点随机性的组合来改变每颗恒星的参数。
画龙点睛
认为现在有一些小的调整可以完成可视化。
首先,恒星出现在太阳的前面。只需要调整zorder星星ax.scatter()功能中的参数即可。将它们移动到太阳下-默认为zorder = 1[3]。
在这一点上,它看起来不错,但星星只是纯白色的点,并不十分令人信服。因此添加了一些随机生成的闪烁。
最后,与地平线天际背后发出的光芒大致相同。添加另一个紫黑色渐变。这次沿着无尽的道路。
就是这样,Matplotlib中的Synthwave!
尽管没有明显的用例,但强烈建议尝试创建类似的东西,因为会在此过程中学到很多东西。而且,说实话,这很有趣!
参考文献
[1]:创建照明线
https://publicwiki.deltares.nl/display/~baart_f/2012/01/03/Creating+illuminated+lines
[2]:宽松的基础知识
https://developers.google.com/web/fundamentals/design-and-ux/animations/the-basics-of-easing
[3]:ZORDER演示
https://matplotlib.org/3.1.1/gallery/misc/zorder_demo.html
项目回购
https://github.com/jamescalam/python_synthwave
合成波
https://www.youtube.com/watch?v=wOMwO5T3yT4