Python数据可视化的例子 |
您所在的位置:网站首页 › 年龄统计图怎么做 › Python数据可视化的例子 |
1.matplotlib模块
应用matplotlib模块绘制条形图,需要调用bar函数,关于该函数的语法和参数含义如下: bar(x, height, width=0.8, bottom=None, color=None, edgecolor=None, linewidth=None, tick_label=None, xerr=None, yerr=None, label = None, ecolor=None, align, log=False, **kwargs) x:传递数值序列,指定条形图中x轴上的刻度值。height:传递数值序列,指定条形图y轴上的高度。width:指定条形图的宽度,默认为0.8。 bottom:用于绘制堆叠条形图。color:指定条形图的填充色。edgecolor:指定条形图的边框色。linewidth:指定条形图边框的宽度,如果指定为0,表示不绘制边框。tick_label:指定条形图的刻度标签。xerr:如果参数不为None,表示在条形图的基础上添加误差棒。yerr:参数含义同xerr。label:指定条形图的标签,一般用以添加图例。ecolor:指定条形图误差棒的颜色。align:指定x轴刻度标签的对齐方式,默认为center,表示刻度标签居中对齐,如果设置为edge,则表示在每个条形的左下角呈现刻度标签。log:bool类型参数,是否对坐标轴进行log变换,默认为False。**kwargs:关键字参数,用于对条形图进行其他设置,如透明度等。bar函数的参数同样很多,希望读者能够认真地掌握每个参数的含义,以便使用时得心应手。下面将基于该函数绘制三类条形图,分别是单变量的垂直或水平条形图、堆叠条形图和水平交错条形图。 (1)垂直或水平条形图 首先来绘制单个离散变量的垂直或水平条形图,数据来源于互联网,反映的是2017年中国六大省份的GDP: 绘图代码如下: import matplotlib.pyplot as plt import pandas as pd GDP_data = pd.read_excel(r'GDP.xlsx') #设置绘图风格 plt.style.use('ggplot') #处理中文乱码 plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] #绘制条形图 plt.bar(x = range(GDP_data.shape[0]), #指定条形图x轴的刻度值(有的是用left,有的要用x) height = GDP_data.GDP, #指定条形图y轴的数值(python3.7不能用y,而应该用height) tick_label = GDP_data.Province, #指定条形图x轴的刻度标签 color = 'steelblue', #指定条形图的填充色 ) #添加y轴的标签 plt.ylabel('GDP(万亿)') #添加条形图的标题 plt.title('2017年度6个省份GDP分布') #为每个条形图添加数值标签 for x,y in enumerate(GDP_data.GDP): plt.text(x,y+0.1,"%s"%round(y,1),ha='center') #round(y,1)是将y值四舍五入到一个小数位 #显示图形 plt.show()
水平条形图 水平条形图不再是bar函数,而是barh函数。 # 绘图 y= y轴, left= 水平条的底部, height 水平条的宽度, width 水平条的长度 p1 = plt.barh(y, left=0, height=0.5, width=x)绘图代码: import matplotlib.pyplot as plt import pandas as pd GDP_data = pd.read_excel(r'GDP.xlsx') #设置绘图风格 plt.style.use('ggplot') #处理中文乱码 plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] #对读入的数据做升序排序 GDP_data.sort_values(by='GDP', inplace=True) #绘制条形图 plt.barh(y = range(GDP_data.shape[0]), #指定条形图y轴的刻度值 width = GDP_data.GDP, #指定条形图x轴的数值 tick_label = GDP_data.Province, #指定条形图y轴的刻度标签 color = 'lightblue', #指定条形图的填充色 ) #添加x轴的标签 plt.xlabel('GDP(万亿)') #添加条形图的标题 plt.title('2017年度6个省份GDP分布') #为每个条形图添加数值标签 for y,x in enumerate(GDP_data.GDP): plt.text(x+0.1,y,"%s"%round(x,1),va='center') #round(y,1)是将y值四舍五入到一个小数位 #显示图形 plt.show()
(2)堆叠条形图 正如前文所介绍的,不管是垂直条形图还是水平条形图,都只是反映单个离散变量的统计图形,如果想通过条形图传递两个离散变量的信息该如何做到?相信读者一定见过堆叠条形图,该类型条形图的横坐标代表一个维度的离散变量,堆叠起来的“块”代表了另一个维度的离散变量。这样的条形图,最大的优点是可以方便比较累积和,那这种条形图该如何通过Python绘制呢?这里以2017年四个季度的产业值为例(数据来源于中国统计局):
(3)水平交错条形图 堆叠条形图可以包含两个离散变量的信息,而且可以比较各季度整体产值的高低水平,但是其缺点是不易区分“块”之间的差异,例如二、三季度的第三产业值差异就不是很明显,区分高低就相对困难。而交错条形图恰好就可以解决这个问题,该类型的条形图就是将堆叠的“块”水平排开,如想绘制这样的条形图,可以参考下方代码(数据来源于胡润财富榜,反映的是5个城市亿万资产超高净值家庭数):
通过pandas模块绘制条形图仍然使用plot方法,该“方法”的语法和参数含义在之前已经详细介绍过,但是plot方法存在一点瑕疵,那就是无法绘制堆叠条形图。下面通过该模块的plot方法绘制单个离散变量的垂直条形图或水平条形图以及两个离散变量的水平交错条形图。 (1)垂直或水平条形图 代码如下: import matplotlib.pyplot as plt import pandas as pd GDP_data = pd.read_excel(r'GDP.xlsx') #设置绘图风格 plt.style.use('ggplot') #处理中文乱码 plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] # 绘图 GDP_data.GDP.plot(kind = 'bar', width = 0.8, rot = 0, color = 'steelblue', title = '2017年度6个省份GDP分布') # 添加y轴标签 plt.ylabel('GDP(万亿)') # 添加x轴刻度标签 plt.xticks(range(len(GDP_data.Province)), #指定刻度标签的位置 GDP_data.Province # 指出具体的刻度标签值 ) # 为每个条形图添加数值标签 for x,y in enumerate(GDP_data.GDP): plt.text(x,y+0.1,'%s' %round(y,1),ha='center') # 显示图形 plt.show()
(2)水平交错条形图 import matplotlib.pyplot as plt import pandas as pd # 读入数据 HuRun = pd.read_excel(r'亿万资产家庭数.xlsx') #设置绘图风格 plt.style.use('ggplot') #处理中文乱码 plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] # Pandas模块之水平交错条形图 HuRun_reshape = HuRun.pivot_table(index = 'City', columns='Year', values='Counts').reset_index() # 对数据集降序排序 HuRun_reshape.sort_values(by = 2016, ascending = False, inplace = True) HuRun_reshape.plot(x = 'City', y = [2016,2017], kind = 'bar', color = ['steelblue', 'indianred'], rot = 0, # 用于旋转x轴刻度标签的角度,0表示水平显示刻度标签 width = 0.8, title = '近两年5个城市亿万资产家庭数比较') # 取出2016年各城市亿万资产家庭数 Counts2016 = HuRun.Counts[HuRun.Year == 2016] # 取出2017年各城市亿万资产家庭数 Counts2017 = HuRun.Counts[HuRun.Year == 2017] #为每个条形图添加数值标签 for x,y in enumerate(Counts2016): plt.text(x-0.2,y+200,"%s"%round(y,1),ha='center') for x,y in enumerate(Counts2017): plt.text(x+0.2,y+200,"%s"%round(y,1),ha='center') # 添加y轴标签 plt.ylabel('亿万资产家庭数') plt.xlabel('') #plt.axis([-0.8,4.8,0,20000]) #用这个可以控制横纵坐标的值域 plt.show()如上代码所示,应用plot方法绘制水平交错条形图,必须更改原始数据集的形状,即将两个离散型变量的水平值分别布置到行与列中(代码中采用透视表的方法实现),最终形成的表格变换下图所示: seaborn模块是一款专门用于绘制统计图形的利器,通过该模块写出来的代码也是非常通俗易懂的。下面就简单介绍一下如何通过该模块完成条形图的绘制(同样无法绘制堆叠条形图)。 (1)垂直或水平条形图 垂直条形图: 代码: import seaborn as sns import pandas as pd import matplotlib.pyplot as plt # 读入数据 GDP_data = pd.read_excel(r'GDP.xlsx') #设置绘图风格 plt.style.use('ggplot') #处理中文乱码 plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] plt.rcParams['axes.unicode_minus']=False #坐标轴负号的处理 #seaborn模块之水平条形图 sns.barplot(x = 'Province', #指定条形图x轴的数据 y = 'GDP', #指定条形图y轴的数据 data = GDP_data, #指定需要绘图的数据集 color = 'steelblue', #指定条形图的填充色 orient = 'v', #将条形图竖直显示 ) #为每个条形图添加数值标签 for x,y in enumerate(GDP_data.GDP): plt.text(x,y+0.1,"%s"%round(y,1),ha='center') # 添加y轴标签 plt.ylabel('GDP(万亿)') plt.xlabel('') #添加条形图的标题 plt.title('2017年度6个省份GDP分布') plt.axis([-0.5,5.5,0,10]) #用这个可以控制横纵坐标的值域 plt.show()运行结果: 运行结果: 先拿表格《近两年5个城市亿万资产家庭数比较》试试手 代码如下: import seaborn as sns import pandas as pd import matplotlib.pyplot as plt # 读入数据 HuRun = pd.read_excel(r'亿万资产家庭数.xlsx') #设置绘图风格 plt.style.use('ggplot') #处理中文乱码 plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] plt.rcParams['axes.unicode_minus']=False #坐标轴负号的处理 #seaborn模块之水平条形图 sns.barplot(x = 'City', #指定条形图x轴的数据 y = 'Counts', #指定条形图y轴的数据 hue = 'Year', #指定分组数据 data = HuRun, #指定需要绘图的数据集 palette = 'RdBu', #指定分组数据即时间的不同颜色 saturation = 1, #指定颜色的透明度,这里设置为无透明度 orient = 'v', #将条形图竖直显示 ) # 取出2016年各城市亿万资产家庭数 Counts2016 = HuRun.Counts[HuRun.Year == 2016] # 取出2017年各城市亿万资产家庭数 Counts2017 = HuRun.Counts[HuRun.Year == 2017] #为每个条形图添加数值标签 for x,y in enumerate(Counts2016): plt.text(x-0.2,y+200,"%s"%round(y,1),ha='center',fontsize=10) #round(y,1)是将y值四舍五入到一个小数位 for x,y in enumerate(Counts2017): plt.text(x+0.2,y+200,"%s"%round(y,1),ha='center',fontsize=10) #fontsize是调节字体大小的函数,默认数值是12 # 添加y轴标签 plt.ylabel('亿万资产家庭数') plt.xlabel('城市') #添加条形图的标题 plt.title('近两年5个城市亿万资产家庭数比较') plt.axis([-0.5,4.5,0,19000]) #用这个可以控制横纵坐标的值域 plt.show()关于条形图颜色,palette函数,中文意思调色板,颜料。具体的讲解可见下面的链接: Seaborn库 手册翻译(二)——颜色控制 超详细Seaborn绘图 ——(一)barplot 运行上面的程序的结果: 拿一个新的数据表格做实验: 下面的表格数据是泰坦尼克号的乘客数据,截屏了一部分。 运行结果: PassengerID Name Age Pclass Sex 3 male 1 Kelly, Mr. James 34.50 female 2 Wilkes, Mrs. James (Ellen Needs) 47.00 2 male 3 Myles, Mr. Thomas Francis 62.00 3 male 4 Wirz, Mr. Albert 27.00 female 5 Hirvonen, Mrs. Alexander (Helga E Lindqvist) 22.00 male 6 Svensson, Mr. Johan Cervin 14.00 female 7 Connolly, Miss. Kate 30.00 2 male 8 Caldwell, Mr. Albert Francis 26.00 3 female 9 Abrahim, Mrs. Joseph (Sophie Halaut Easu) 18.00 male 10 Davies, Mr. John Samuel 21.00 male 11 Ilieff, Mr. Ylio 24.00 1 male 12 Jones, Mr. Charles Cresson 46.00 female 13 Snyder, Mrs. John Pillsbury (Nelle Stevenson) 23.00 2 male 14 Howard, Mr. Benjamin 63.00 1 female 15 Chaffee, Mrs. Herbert Fuller (Carrie Constance... 47.00 2 female 16 del Carlo, Mrs. Sebastiano (Argenia Genovesi) 24.00 male 17 Keane, Mr. Daniel 35.00 3 male 18 Assaf, Mr. Gerios 21.00 female 19 Ilmakangas, Miss. Ida Livija 27.00 female 20 Assaf Khalil, Mrs. Mariana (Miriam")" 45.00 #....................................................................................(省略大部分数据) male 400 Conlon, Mr. Thomas Henry 31.00 1 female 401 Bonnell, Miss. Caroline 30.00 2 male 402 Gale, Mr. Harry 38.00 1 female 403 Gibson, Miss. Dorothy Winifred 22.00 male 404 Carrau, Mr. Jose Pedro 17.00 male 405 Frauenthal, Mr. Isaac Gerald 43.00 2 male 406 Nourney, Mr. Alfred (Baron von Drachstedt")" 20.00 male 407 Ware, Mr. William Jeffery 23.00 1 male 408 Widener, Mr. George Dunton 50.00 3 female 409 Riordan, Miss. Johanna Hannah"" 22.00 female 410 Peacock, Miss. Treasteall 3.00 female 411 Naughton, Miss. Hannah 22.00 1 female 412 Minahan, Mrs. William Edward (Lillian E Thorpe) 37.00 3 female 413 Henriksson, Miss. Jenny Lovisa 28.00 male 414 Spector, Mr. Woolf 24.00 1 female 415 Oliva y Ocana, Dona. Fermina 39.00 3 male 416 Saether, Mr. Simon Sivertsen 38.50 male 417 Ware, Mr. Frederick 24.00 male 418 Peter, Master. Michael J 24.00
|
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |