数据可视化第二周
一、时序数据和比例数据展示可用图表
二、离散场景和连续场景两组数据分析展示
2.1离散场景1
时序数据数据集1,场景某电商公司2018年销售额整体趋势情况,以及不同品类销售额的发展趋势,可用折线图。(第一次觉得用百分比堆叠图或者普通堆叠图表示较好,并列柱状图可能数据线条比较多,而且折现条数也是,用百分比堆叠图,能利用百分比堆叠图各类趋势变化,还有占比比较清楚。普通的堆叠图应该也可以,不过4个题目全看过后感觉还是用折线图试试)。
(1)点线图
#coding=utf-8
#小试牛刀
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
df = pd.read_excel(r'd:\excel\ksh02-01.xlsx',sheet_name='Sheet1')
df2 = pd.read_excel(r'd:\excel\ksh02-01.xlsx',sheet_name='Sheet2')
array = df.values
df_new = pd.DataFrame(array[:,1:],index =array[:,0] ,columns=df.columns[1:])
plt.plot(df_new['3C电子(元)'],'r-',df_new['美妆个护(元)'],'y-',df_new['食品饮料(元)'],'g.-')
plt.show()
#coding=utf-8
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
df = pd.read_excel(r'd:\excel\ksh02-01.xlsx',sheet_name='Sheet1')
df2 = pd.read_excel(r'd:\excel\ksh02-01.xlsx',sheet_name='Sheet2')
df.plot()#pandas dataframe中自带的plot绘图
plt.show()
(2)3C变化-条形图
如果所有的曲线均用条形图在一张图片上展示,会显的很密集,不符合分类3-4中,且总数又很多的情况。
df.plot(kind=‘barh’) #绘制横向bar
df.plot(kind=‘bar’)#绘制竖向
(3)3C拟合曲线
虽然从数据上感觉总体3C是逐渐下降的,这里通过3次多项式拟合曲线明显感觉在下降。(前段时间关于天猫近几年销售额的预测,它是上半年或者很久前的预测,却是如此的接近,3次拟合的结果,因此你懂的)我们把月份再往后拉几个月的,可以看出如下图:
三次拟合多项式
f
(
x
)
=
−
38.46
x
2
+
758.2
x
2
−
5379
x
+
6.782
e
+
04
f(x)= -38.46 x^2 + 758.2 x^2 - 5379 x + 6.782e^{+04}
f(x)=−38.46x2+758.2x2−5379x+6.782e+04
(4)3C产品每月变化及环比变化趋势
2.2离散场景2
场景2:某只股票在2019年10月份的价格变动,因为每日都有值,次日值,同时还有价格变动,可以用阶梯图,把变动或者波动表示出来,类似股票蜡烛图。
2.3连续场景1
看到数据有分类,一级时效、二级时效,还有当日揽收、次日揽收,有比例占比,因此可以用比例型,并且含有分类,可以尝试饼图,或者环形图。
2.4连续场景2
根据要求既要对比各公司内部不同场景下比例,同时又要比较同类业务中各公司间占比差异,因此第一个想到的就是普通堆叠柱状图,如果用百分比堆叠柱状图,有个总量的百分100%,同类业务不同公司占比可能就有些问题,不过可以试试两种方式。
#这里需要先在excel表中把总承运量给去掉
df = pd.read_excel(r'd:\excel\ksh02-01.xlsx',sheet_name='Sheet1')
df2 = pd.read_excel(r'd:\excel\ksh02-01.xlsx',sheet_name='Sheet2')
df2.index=df2['快递公司']
df2.plot(kind='bar',stacked=True)
plt.show()
数据:
excel sheet1 统计数据:
3C电子(元) 美妆个护(元) ... 家居电器(元) 总销售额(元)
1. count 12.000000 12.000000 ... 12.000000 1.200000e+01
mean 56250.000000 85583.333333 ... 290833.333333 6.985000e+05
std 5361.902647 8867.287515 ... 257318.632804 3.731354e+05
min 50000.000000 70000.000000 ... 60000.000000 3.170000e+05
25% 52750.000000 79500.000000 ... 115000.000000 4.360000e+05
50% 55500.000000 85000.000000 ... 195000.000000 6.025000e+05
75% 58250.000000 91750.000000 ... 370000.000000 7.942500e+05
max 70000.000000 100000.000000 ... 895000.000000 1.582500e+06
'''
月份 3C电子(元) 美妆个护(元) 食品饮料(元) 服装鞋帽(元) 家居电器(元) 总销售额(元)
0 1月 70000 70000 70000 70000 70000 350000
1 2月 60000 77000 60000 60000 60000 317000
2 3月 59000 78000 69000 100000 100000 406000
3 4月 58000 80000 86000 260000 260000 744000
4 5月 57000 82000 64000 240000 340000 783000
5 6月 56000 84000 60000 200000 200000 600000
6 7月 55000 86000 75000 150000 150000 516000
7 8月 54000 88000 66000 160000 460000 828000
8 9月 53000 91000 62000 120000 120000 446000
9 10月 52000 94000 79000 190000 190000 605000
10 11月 51000 97000 79500 460000 895000 1582500
11 12月 50000 100000 64500 345000 645000 1204500
:dataframe值
快递公司 省外件 省内非同城件 省内同城件
0 顺丰 2100 1000 500
1 中通 1800 900 800
2 圆通 1900 700 700
3 申通 1700 700 700
4 韵达 1300 900 700
5 EMS 1900 600 200
参考代码python:
#coding=utf-8
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
df = pd.read_excel(r'd:\excel\ksh02-01.xlsx',sheet_name='Sheet1')
df2 = pd.read_excel(r'd:\excel\ksh02-01.xlsx',sheet_name='Sheet2')
#print(df.values)
array = df.values
#print(array[:,0])
#print(array[:,1:])
#print(df.columns)
df_new = pd.DataFrame(array[:,1:],index =array[:,0] ,columns=df.columns[1:])
#print(df_new)
#print(df_new['3C电子(元)'])
plt.plot(df_new['3C电子(元)'],'r-',df_new['美妆个护(元)'],'y-',df_new['食品饮料(元)'],'g.-')
plt.bar(df_new.index,df_new['3C电子(元)'],label='3C电子',color='steelblue',alpha=0.8)#plt.show()
#3次多项式拟合f1_index = np.arange(12)f1_x = np.array([70000,60000,59000,58000,57000,56000,55000,54000,53000,52000,51000,50000])
f1 = np.polyfit(f1_index,f1_x,3)
p1 = np.poly1d(f1)
#print(p1)
f1_index_x = np.arange(18)
yvals = p1(f1_index_x)
plot1 = plt.plot(f1_index,f1_x,'s',label = 'original values')
plot2 = plt.plot(f1_index_x,yvals,'r',label='polyfit values')
plt.xlabel('3C电子')plt.ylabel('销售额')
#plt.legend()
#plt.show()
''' 3 2-38.46 x + 758.2 x - 5379 x + 6.782e+04'''
#展示数据柱状图及每个月变化百分比-3C为例
f1_x1 = np.array([80000,70000,60000,59000,58000,57000,56000,55000,54000,53000,52000,51000])
percent3C = np.round((f1_x-f1_x1)/f1_x, decimals=4)
fig = plt.figure()
ax1 = fig.add_subplot(111)
ax1.bar(f1_index,f1_x,alpha=.7,color='g')
ax1.set_ylabel('销售额',fontsize='10')
ax2 = ax1.twinx()
ax2.plot(f1_index,percent3C*100,'r',ms=10)
ax2.set_ylabel('环比%',fontsize='10')
#plt.show()
df_t = df_new.Tprint(df)
#coding=utf-8
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
df = pd.read_excel(r'd:\excel\ksh02-01.xlsx',sheet_name='Sheet1')
df2 = pd.read_excel(r'd:\excel\ksh02-01.xlsx',sheet_name='Sheet2')
#df.plot()
df.plot(kind='bar')
plt.show()
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
df2 = pd.read_excel(r'd:\excel\ksh02-01.xlsx',sheet_name='Sheet2')
#print(df.describe())
#df.plot()
print(df2)
#print(df2.index)
#df2.index=df2['快递公司']
df2.plot(kind='bar',stacked=True)
plt.show()
python pandas DataFrame绘制图片plot
参考:https://blog.csdn.net/brucewong0516/article/details/80524442