大家好,我是马友发,但是想码还想有头发,那系不阔能的啦~(手动滑稽
上次我们聊到了如何用matplotlib来绘制一幅动图,看来各位看官并不买账啊。
稳如脱发,关系不大。这次咱们还是用matplotlib来绘制一幅动次大次的效果图,准备好了么,野迪蹦起来!扭贼!(music。。)
先抑制一下你那颗躁动的心,安安稳稳的坐好,咱们来理性的分析一波。
相信绝大多经历过酷狗时代的人都知道(我没说现在酷狗不行了,不吹不黑),那时候看到播放音乐的频率效果,一上一下的律动简直嗨翻全场,不好意思那时候的人就是这么朴实。
今天咱们就用代码来绘制出这样的“酷炫效果”,不信?码起来!
简单的来说,我们可以把这种频率图看做是动态的柱状图(这么一解释好Low啊),只是说我们要想明白,怎么让一个柱状图显得酷炫一些。
比如像上方的图形,加了倒影和背景的亮点,怎么看都有一种黑科技的感觉。
那么好的!咱们就画一个和他不一样的。
首先的问题是,matplotlib如何绘制柱状图?之前我们只说过散点图,曲线图,圆之类的画法。问题不大,再教你一招!
现在请幻想一个场景,你是某公司的职员,Helen。你的老板,Tony老师,给了你一份各销售近几个月的销售情况数据。
他的原话是“Helen啊,我想看一下公司近期的销售情况,但是我又不想看数字,你帮我做一套简单又复杂的图表给我吧,我想不费脑子又能看懂这些数据。”
你握着40米大刀的手逐渐僵硬,但是没办法,谁让人家是首席美发师呢。(开个玩笑)
从一定程度上来说,折线图或者柱状图,都能够比较好的体现出数据的走势。但是如果数据比较复杂或者需要显示多条数据,比如同时在一张表中显示本月,上月,去年本月等等之类数据时,折线图会看起来比较乱。
不知道你的感受如何,至少让我没有看下去的欲望。甚至想把这篇文章都关了。请等等!
回到主题,我们来看一下matplotlib如何绘制柱状图。
第一步,当然是拿到数据,正常的情况下都会存在excel中。但是呢,我就是这么特立独行,我准备胡编乱造一些,反正你们的数据也是瞎编的嘛~
import matplotlib.pyplot as plt
import numpy as np
sales_cur_month=np.array( [84,56,91,34,25])
sales=np.array(['Linda','Peter','Rose','John','Ma Youfa'])
x=np.arange(len(sales))
plt.bar(x,sales_cur_month)
plt.show()
上方的代码可以绘制出一张最为普通的柱状图,这也是大多数人止步的地方。
这么看起来并不美观x轴的数字我想变成对应的人名。
我想给整张图表加个标题
我想在一张图表中显示三列柱状图,代表本月,上月,以及去年今年销量
我想让图表更好看,酷炫一些
我还没想好。
接下来,欢迎收看民科TV《梦想改造家》。改造工程,现在开始!(注意看,都是干货!)
import matplotlib.pyplot as plt
import numpy as np
sales_cur_month=np.array( [84,56,91,34,25])
sales_last_month=np.array( [54,67,34,33,65])
sales_last_year=np.array( [23,49,0,65,32])
sales=np.array(['Linda','Peter','Rose','John','Ma Youfa'])
x=np.arange(len(sales))
plt.bar(x-0.3,sales_cur_month,width=0.2,label='cur month')
plt.bar(x-0.1,sales_last_month,width=0.2,label='last month')
plt.bar(x+0.1,sales_last_year,width=0.2,label='last year')
plt.xticks(x,sales) #将数字替换为对应人名
plt.title('sales record')
plt.ylabel('sales amt')
plt.legend()
plt.show()
咱们还是国际惯例,先看结果。
好棒哦~想给自己撒花!提出的要求都实现了,并且这颜色排布看起来还挺清晰的,老板应该没有理由难为咱们了。(matplotlib官方对于中文的支持不太好,需要调整相应参数,我因为懒,还没去找。。)
咱们回看一下代码,主要请观察如何在一张图中,画出了3条柱状图的方法。
plt.bar(x-0.3,sales_cur_month,width=0.2,label='cur month')
plt.bar(x-0.1,sales_last_month,width=0.2,label='last month')
plt.bar(x+0.1,sales_last_year,width=0.2,label='last year')
这里我们需要手动去调整每一条柱状图所处的位置,当前的x代表了一个数组
[0,1,2,3,4]
每一行代码中的第一个参数,也就是x-0.3之类,代表了每一条柱形图的“中线”在哪里,比如对于Linda这条数据,中线分别是-0.3,-0.1,0.1。
并且我设置了每条柱形图宽度为0.2,所以他们会紧密排布在一起。(别觉得懵,自己在纸上一画就明白了)
如果你想将他们之间稍微分隔,并且主要体现出本月的销售额,也可以如下调整,相当于在每条柱形图间增加0.05的空隙。
plt.bar(x-0.4,sales_cur_month,width=0.3,label='cur month') #-0.55~0.25
plt.bar(x-0.1,sales_last_month,width=0.2,label='last month') #-0.2~0
plt.bar(x+0.15,sales_last_year,width=0.2,label='last year') #0.05~0.25
从目前而言,我们已经清楚了如何绘制柱状图。接下来,咱们让柱状图,动起来!
上一期我们说过,一个动画的制作主要是在关注每变动一帧,会产生何种变化。
再来理性的分析一波。我们希望每条柱之间有一个非常小的距离
每条柱状图的颜色,宽度保持一致
在1秒之内完成冲顶和回落的过程
我没想好
先看看结果。
由于我们现在没有去真正的解析一段音乐,所以每次冲到的最高点,我们设置为一个0~1之间的随机数字。
比如当前设置为40帧,那么相当于我需要用20张图片来完成“冲顶”,再用20张图片完成“降落”。
从第一版的效果来说,功能性达到了,但是,并没有让我想摇起来的冲动。为了体现出那种视觉上的冲击感,我们也在每个柱状图上面,增加一个下落的直线,来看看效果!
就是它了!如果可以,现在请放一首“苍茫的天涯是我的爱”!跟着我的节奏一起摇摆!
源码将在下一期给出,各位看官可以先动手试试哦~
看完之后还请点个赞,您的支持是我继续下去的动力呢!