疫情数据可视化讨论,作为数据分析师的我真是太“南”了!(附代码)

关于可视化选择的讨论?

1.前言

近日,有朋友在群里抛出了一个话题【关于丁香园、腾讯和百度画的国内疫情趋势图,哪个更好?】。居士万万没想到这个话题能引起如此大量的讨论,以至于几个数据分析的交流群里面都讨论炸锅了。居士关于该话题的朋友圈,下面也有几十条评论,此话题的威力,恐怖如斯

正如居士在群里所说:“你来讨论几句这个话题,居士还一篇千字以上的文章给你~“,因此,居士将会对该话题进行一定的总结和分析,并给出居士的个人建议。

同时,为了让大家感受最原汁原味的讨论内容,居士会从这么多观点中抽出6个观点,展示给大家,每个观点居士都留言评论了。

2.腾讯、丁香园 vs 百度

关于腾讯和百度画的国内疫情趋势图哪个更好,居士通过对比两个图,加上这次讨论,统一整理了一下。

主要从三个视角来讨论,分别从用户视角、数据分析视角以及业务视角进行分析。

以下是丁香园、腾讯的国内疫情趋势图,采用直接画图法,即数据未经过处理,直接画成折线图。

腾讯画图.png

用户视角:该方法直接展示真实数据的分布趋势,便于用户直观了解真实情况。

数据分析视角:由于存在一个离散点,使得折线图其他部分的视觉上波动不明显,不易于发现数据规律。但是由于面向对象是普通大众,这种展示方式比较符合大众思路,而且由于是疫情信息,每多做一种变换处理,都有可能带了不确定的政策风险,这种思路比较稳妥。

业务视角:虽然离散点对其他数据的影响较大,但是该方法展示真实数据的分布趋势,比较推荐。

以下是百度的国内疫情趋势图,采用不等距画图法,即数据经过映射处理,再画成折线图。

百度画图.png

用户视角:该画图方法通过改变原始数据,不易于用户直观了解数据之间的差异和真实的情况。

数据分析视角:该方法可消除离散点对其他数据的影响,容易看出数据趋势的规律。

业务视角:该方法虽然改变部分数据的映射,从用户角度看,存在一定视觉欺骗性,但是易于大众发现国内疫情趋势的变化规律,好处和缺点都比较明显。

3.有没有更好的可视化方法?

首先,居士想说明的是,这里没有绝对好的可视化方法,只有适合数据的可视化方法。

接着分享其他三种展示国内疫情趋势的可视化方法。

3.1 取对数画图法

顾明思议,该方法便是将原始的数据取对数,再进行可视化。

以下代码是将数据取对数。

#将数据取对数
def data_to_log(data):
    a=[]
    for i in data:
        if i>0:
            a.append(log(i))
        else:
            a.append(i)
    return a

接着将数据进行可视化。

f=plt.figure(figsize=[20,12])
ax=f.subplots(1,1)
a=[log(i) for i in day_add_pd['everyday_addconfirm']]
b=[log(i) for i in day_add_pd['everyday_addsuspect']]
c=data_to_log(day_add_pd['everyday_adddead'])
d=data_to_log(day_add_pd['everyday_addheal'])
ax.plot(day_add_pd['date_addlist'],a,color='#E54646',marker='o', linestyle='solid',label='新增确诊')
ax.plot(day_add_pd['date_addlist'],b,color='#F1AF00',marker='o', linestyle='solid',label='新增疑似')
ax.plot(day_add_pd['date_addlist'],c,color='#707070',marker='o', linestyle='solid',label='新增死亡')
ax.plot(day_add_pd['date_addlist'],d,color='#00B2BF',marker='o', linestyle='solid',label='新增治愈')
plt.xticks(day_add_pd['date_addlist'], rotation=45,fontsize=12) # 刻度值
plt.legend(fontsize=20)
plt.yticks(fontsize=20)

图表展示。

取对数法.png

用户视角:该画图方法将数值数据取对数,不易于用户直观了解数据之间的分布和真实情况。

数据分析视角:该方法可消除离散点对其他数据的影响,易于发现数据的规律。

业务视角: 虽然可通过该方法发现数据规律,但是原始数据被改变,普遍大众很难将对数进行转化,使得大众不了解真实的数据值,该方法不推荐使用。

3.2 滑动时间轴法

简单来说,使用该方法绘制图形,用户可通过选择相应的时间进行可视化。

以下是可视化代码。

import pyecharts.options as opts
from pyecharts.charts import Line
def line_smooth(data) -> Line:
    c = (
        Line()
        .add_xaxis(["2020/{}/{}".format(int(data['date_addlist'][i][0:2]),int(data['date_addlist'][i][3:5])) for i in range(len(data['date_addlist']))])
        .add_yaxis("新增确诊", data['everyday_addconfirm'], is_smooth=True,itemstyle_opts=opts.ItemStyleOpts(
                color="#E54646"),markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_="max")]),)
        .add_yaxis("新增疑似", data['everyday_addsuspect'], is_smooth=True,itemstyle_opts=opts.ItemStyleOpts(
                color="#F1AF00"),markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_="max")]),)
        .add_yaxis("新增死亡", data['everyday_adddead'], is_smooth=True,itemstyle_opts=opts.ItemStyleOpts(
                color="#707070"),markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_="max")]),)
        .add_yaxis("新增治愈", data['everyday_addheal'], is_smooth=True,itemstyle_opts=opts.ItemStyleOpts(
                color="#00B2BF"),markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_="max")]),)
        .set_global_opts(title_opts=opts.TitleOpts(title="Line-smooth"))
        .set_global_opts(datazoom_opts=[opts.DataZoomOpts()]
                        )
        .set_series_opts(
           label_opts=opts.LabelOpts(is_show=False),
            linestyle_opts=opts.LineStyleOpts(width = 2,type_='solid'),
        )
    )
    return c
line_smooth(day_add_pd).render()

图表展示。

滑动时间轴.png

用户视角:通过时间的选择,观看局部的数据,研究局部数据的规律;选择全部数据,观看整体数据的分布趋势。

数据分析视角:通过截取部分时间,可消除离散点对局部数据变化趋势的影响,易于发现局部数据的规律

业务视角:  即可直接展示真实数据的分布趋势,又可通过选取局部数据来观察局部数据的规律,比较推荐。不过由于需要交互插件,报告中就不好使用了

3.3 截断离散点画图法

直白的说,该方法便是将离散点从原始数据拿出,再分别进行画图。

以下是可视化代码。

p=plt.figure(figsize=[20,14])
ax1= p.add_subplot(212)  # 绘制两个子图
plt.subplots_adjust(wspace=0,hspace=0.1) # 设置子图间距
plt.plot(day_add_pd['date_addlist'],day_add_pd['everyday_addconfirm'],color='#E54646',marker='o', linestyle='solid',label='新增确诊')
plt.plot(day_add_pd['date_addlist'],day_add_pd['everyday_addsuspect'], color='#F1AF00', marker='o',label='新增疑似')   # 绘制折线
plt.plot(day_add_pd['date_addlist'],day_add_pd['everyday_adddead'],color='#707070',marker='o', linestyle='solid',label='新增死亡')
plt.plot(day_add_pd['date_addlist'],day_add_pd['everyday_addheal'],color='#00B2BF',marker='o', linestyle='solid',label='新增治愈')
plt.xticks(rotation=45,fontsize=12) # 刻度值
plt.yticks(fontsize=20)


ax= p.add_subplot(211)  # 绘制两个子图
ax.xaxis.set_major_locator(plt.NullLocator()) # 删除坐标轴的刻度显示
plt.plot(day_add_pd['date_addlist'],day_add_pd['everyday_addsuspect'], color='#F1AF00', marker='o',label='新增疑似')   # 绘制折线
plt.plot(day_add_pd['date_addlist'],day_add_pd['everyday_adddead'],color='#707070',marker='o', linestyle='solid',label='新增死亡')
plt.plot(day_add_pd['date_addlist'],day_add_pd['everyday_addheal'],color='#00B2BF',marker='o', linestyle='solid',label='新增治愈')
plt.plot(day_add_pd['date_addlist'],day_add_pd['everyday_addconfirm'],color='#E54646',marker='o', linestyle='solid',label='新增确诊')
plt.xticks(rotation=45,fontsize=12) # 刻度值
plt.yticks(fontsize=20)
ax.set_ylim(6000, 20000) # 设置纵坐标范围
ax1.set_ylim(0, 6000)  # 设置纵坐标范围


ax.grid(axis='both',linestyle='-.') # 打开网格线
ax1.grid(axis='y',linestyle='-.')   # 打开网格线


ax.legend(fontsize=20) # 让图例生效
#plt.xlabel("日期") #X轴标签
#plt.ylabel("疫情数据") #Y轴标签


ax1.spines['top'].set_visible(False)    # 边框控制
ax1.spines['bottom'].set_visible(True) # 边框控制
ax1.spines['right'].set_visible(False)  # 边框控制


ax.spines['top'].set_visible(False)   # 边框控制
ax.spines['bottom'].set_visible(False) # 边框控制
ax.spines['right'].set_visible(False)  # 边框控制


ax1.tick_params(labeltop='off')


# 绘制断层线
d = 0.02  # 断层线的大小
kwargs = dict(transform=ax.transAxes, color='k', clip_on=False)
ax.plot((-d, +d), (-d, +d), **kwargs)        # top-left diagonal


kwargs.update(transform=ax1.transAxes, color='k')  # switch to the bottom ax1es
ax1.plot((-d, +d), (1 - d, 1 + d), **kwargs)  # bottom-left diagonal


plt.show()

图表展示。

截断画图法.png

用户视角:该图将离散点单独绘制,依然能直观地了解真实数据和数据的分布趋势。

数据分析视角:通过将离散点截出,可消除离散点对整体数据规律的影响,便于挖掘数据规律。

业务视角: 该方法即让大众了解原始数据,又易于挖掘数据的规律,推荐。不过从习惯上与平时略有差异。

4.大家的观点

大家的观点很多,从这里列出6点,居士也都做了评论,欢迎留言认领

观点1

不太建议取对数画图,感觉会麻痹一些人的认识。

很认同该观点,取对数画图,将数据大大改变了。

观点2

默认展示过去7天的然后时间可调整,或者坐标轴做成可调整的。

该观点类似于滑动时间轴法。

观点3

图是要直观展示数据的,我觉得大多数人还是习惯于图里的刻度是均匀的,这样曲线的形状才有确定的数值高低的含义。

该观点与腾讯的作图思路不谋而合啊。

观点4

说实话,该国内疫情趋势图很好体现数据分析师的难处。这个图,数据分析从业角度,很多人有各种意见,很难让人心服口服。而且即使有一个人有天才的思路解决了,我觉得普通人或者boss,也不会觉得有多厉害。

很赞成该观点,确实是没有最正确的可视化方法,只有合适数据的可视化方法。

观点5

图形可视化是为了告诉大家某个事实。但如果你用的可视化表现形式不是大家能理解的,最后也肯定不能达到让大家知道这个事实的效果。

对的,可视化就是为了让大家更方便的了解数据的真实情况和分布趋势。

观点6

关于指标体系的标准,用户的信息获取效率必须作为最核心的标准,进而细化为指标管理规范、开发规范、可视化标准等等,单纯追求全面、图表炫酷压根不是企业实践的需要!

同意,用户的信息获取效率确实是可视化最终目标。不过这句话就是老生常谈了,大家都想做,但是都知道不容易。


最后如果你觉得内容还不错,欢迎安利给你的各个小伙伴~

往期精彩回顾




适合初学者入门人工智能的路线及资料下载机器学习在线手册深度学习在线手册AI基础下载(pdf更新到25集)本站qq群1003271085,加入微信群请回复“加群”获取一折本站知识星球优惠券,请回复“知识星球”喜欢文章,点个在看
  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值