Python数据分析实战① Python实现数据可视化

文章目录

    • 一、数据可视化介绍
    • 二、matplotlib和pandas画图
      • 1.matplotlib简介和简单使用
      • 2.matplotlib常见作图类型
      • 3.使用pandas画图
      • 4.pandas中绘图与matplotlib结合使用
    • 三、订单数据分析展示
    • 四、Titanic灾难数据分析显示

一、数据可视化介绍

数据可视化是指将数据放在可视环境中、进一步理解数据的技术,可以通过它更加详细地了解隐藏在数据表面之下的模式趋势相关性

Python提供了很多数据可视化的库:

  • matplotlib
    是Python基础的画图库,官网为https://matplotlib.org/,在案例地址https://matplotlib.org/gallery/index.html中介绍了很多种类的图和代码示例。
  • pandas
    是在matplotlib的基础上实现画图的,官网为https://pandas.pydata.org/。
  • matlpotlib和pandas结合
    利用pandas进行数据读取、数据清洗和数据选取等操作,再使用matlpotlib显示数据。

二、matplotlib和pandas画图

1.matplotlib简介和简单使用

matplotlib是Python最著名的绘图库,它提供了一整套和Matlab相似的命令API,十分适合进行交互式制图;也可以方便地将它作为绘图控件,嵌入GUI应用程序中。
文档相当完备,并且Gallery页面中有上百幅缩略图,打开之后都有源代码。如果需要绘制某种类型的图,只需要在这个页面中进行简单的浏览、复制、粘贴,就能实现画图。
https://matplotlib.org/gallery.html中有大量的缩略图案例可以使用。

matplotlib画图的子库:

  • pyplot子库
    提供了和matlab类似的绘图API,方便用户快速绘制2D图表。
  • pylab模块
    其中包括了许多numpy和pyplot中常用的函数,方便用户快速进行计算和绘图,可以用于IPython中的快速交互式使用。

使用matplotlib快速绘图导入库和创建绘图对象如下:

import matplotlib.pyplot as pltplt.figure(figsize=(8,4))

创建绘图对象时,同时使它成为当前的绘图对象。
通过figsize参数可以指定绘图对象的宽度和高度,单位为英寸;
dpi参数指定绘图对象的分辨率,即每英寸多少个像素,缺省值为80。
因此本例中所创建的图表窗口的宽度为8 * 80 = 640像素。

也可以不创建绘图对象直接调用plot方法绘图,matplotlib会自动创建一个绘图对象。
如果需要同时绘制多幅图表的话,可以给figure传递一个整数参数指定图标的序号,如果所指定序号的绘图对象已经存在的话,将不创建新的对象,而只是让它成为当前绘图对象。

pyplot画图简单使用如下:

import numpy as np
import matplotlib.pyplot as plt # 首先载入matplotlib的绘图模块pyplot,并且重命名为pltx = np.linspace(0, 10, 1000)  y = np.sin(x)
z = np.cos(x**2)plt.figure(figsize=(8,4))   #2 创建绘图对象plt.plot(x,y,label="$sin(x)$",color="red",linewidth=2)
plt.plot(x,z,"b--",label="$cos(x^2)$") plt.xlabel("Time(s)") 
plt.ylabel("Volt")
plt.title("PyPlot First Example")
plt.ylim(-1.2,1.2)
plt.legend()plt.show()

显示:
python plt pyplot simple

其中:

plt.plot(x,y,label="$sin(x)$",color="red",linewidth=2)
plt.plot(x,z,"b--",label="$cos(x^2)$")

第一行将x、y数组传递给plot之后,用关键字参数指定各种属性:

  • label
    给所绘制的曲线取一个名字,用于在图示(legend)中显示;
    在字符串前后添加$符号,就会使用内置的latex引擎绘制数学公式。
  • color
    指定曲线的颜色:颜色可以用英文单词,或者以#字符开头的三个16进制数,例如#ff0000表示红色,或者用值在0到1范围之内的三个元素的元组表示,例如(1.0, 0.0, 0.0)也表示红色。
  • linewidth
    指定曲线的宽度,可以不是整数,也可以使用缩写形式的参数名lw
  • 曲线样式
    第三个参数b--指定曲线的颜色和线型,它通过一些易记的符号指定曲线的样式,其中b表示蓝色,--表示线型为虚线。
    在IPython中输入plt.plot?可以查看格式化字符串以及各个参数的详细说明。
plt.xlabel("Time(s)") 
plt.ylabel("Volt")
plt.title("PyPlot First Example")
plt.ylim(-1.2,1.2)
plt.legend()

通过一系列函数设置当前Axes对象的各个属性:

  • xlabel、ylabel
    分别设置X、Y轴的标题文字。
  • title
    设置子图的标题。
  • xlim、ylim
    分别设置X、Y轴的显示范围。
  • legend
    显示图示,即图中表示每条曲线的标签(label)和样式的矩形区域。

最后调用plt.show()显示出绘图窗口。

一个绘图对象(figure)可以包含多个轴(axis),在Matplotlib中用轴表示一个绘图区域,可以将其理解为子图。上面的第一个例子中,绘图对象只包括一个轴,因此只显示了一个轴(子图Axes)。可以使用subplot函数快速绘制有多个轴的图表。
subplot函数的调用形式如下:

subplot(numRows, numCols, plotNum)

subplot将整个绘图区域等分为numRows行和numCols列个子区域,然后按照从左到右、从上到下的顺序对每个子区域进行编号,左上的子区域的编号为1。
如果numRows、numCols和plotNum这三个数都小于10的话,可以把它们缩写为一个整数,例如subplot(323)subplot(3,2,3)是相同的。
subplot在plotNum指定的区域中创建一个轴对象,如果新创建的轴和之前创建的轴重叠,之前的轴将被删除。

如下:

for idx, color in enumerate("rgbyck"):plt.subplot(320+idx+1, facecolor=color)
plt.show()

显示:
python plt pyplot subplot

可以看到:
创建3行2列共6个轴,通过facecolor参数给每个轴设置不同的背景颜色。

如果希望某个轴占据整个行或者列的话,可以如下:

plt.subplot(221) # 第一行的左图
plt.subplot(222) # 第一行的右图
plt.subplot(212) # 第二整行
plt.show()

显示:
python plt pyplot subplot whole

再举一个创建子图的例子:

plt.figure(1) # 创建图表1
plt.figure(2) # 创建图表2
ax1 = plt.subplot(211) # 在图表2中创建子图1
ax2 = plt.subplot(212) # 在图表2中创建子图2x = np.linspace(0, 3, 100)
for i in range(5):plt.figure(1) # 选择图表1plt.plot(x, np.exp(i*x/3))plt.sca(ax1) # 选择图表2的子图1,将当前轴实例设置为axplt.plot(x, np.sin(i*x))plt.sca(ax2) # 选择图表2的子图2plt.plot(x, np.cos(i*x))
plt.show()

显示:
python plt pyplot subplot for

首先通过figure()创建了两个图表,它们的序号分别为1和2;
然后在图表2中创建了上下并排的两个子图,并用变量ax1和ax2保存。
在循环中:
先调用figure(1)让图表1成为当前图表,并在其中绘图。
然后调用sca(ax1)sca(ax2)分别让子图ax1和ax2成为当前子图,并在其中绘图。
当它们成为当前子图时,包含它们的图表2也自动成为当前图表,因此不需要调用figure(2)依次在图表1和图表2的两个子图之间切换,逐步在其中添加新的曲线即可。

其中,twinx()可以为图增加纵坐标轴,使用如下:

x = np.arange(1, 21, 0.1)y1 = x * x
y2 = np.log(x)plt.plot(x, y1)# 添加一条y轴的坐标轴
plt.twinx()
plt.plot(x, y2)plt.show()

显示:
python plt pyplot twinx

进一步使用如下:

import numpy as np
import matplotlib.pyplot as pltx = np.arange(1, 20, 1)
y1 = x * x
y2 = np.log(x)fig = plt.figure()
ax1 = fig.add_subplot(111)ax1.plot(x, y1, label = "$y1 = x * x$", color = "r")
ax1.legend(loc = 0)
# 设置对应坐标轴的名称
ax1.set_ylabel("y1")
ax1.set_xlabel("Compare y1 and y2")# 设置x轴刻度的数量
ax = plt.gca()
ax.locator_params("x", nbins = 20)# 添加坐标轴,并在新添加的坐标轴中画y2 = log(x)图像
ax2 = plt.twinx()
ax2.set_ylabel("y2")
ax2.plot(x, y2, label = "$y2 = log(x)$")
ax2.legend(loc = 0)plt.show()

显示:
python plt pyplot twinx detail

2.matplotlib常见作图类型

画图在工作中在所难免,尤其在进行数据探索时显得尤其重要,matplotlib常见的一些作图种类如下:

  • 散点图
  • 条形图
  • 饼图
  • 三维图

先导入库和基础配置如下:

from __future__ import division
from numpy.random import randn
import numpy as np
import os
import matplotlib.pyplot as plt
np.random.seed(12345)
plt.rc('figure', figsize=(10, 6))
from pandas import Series, DataFrame
import pandas as pd
np.set_printoptions(precision=4)get_ipython().magic(u'matplotlib inline')
get_ipython().magic(u'pwd')

打印:

'XXX\\3_Visualization_Of_Data_Analysis\\basicuse'

基础画图如下:

# matplotlib创建图表
plt.plot([1,2,3,2,3,2,2,1])
plt.show()plt.plot([4,3,2,1],[1,2,3,4])
plt.show()

显示:
python plt pyplot type basic

画三角函数曲线如下:

# 画简单的图形
from pylab import *
x=np.linspace(-np.pi,np.pi,256,endpoint=True)
c,s=np.cos(x),np.sin(x)
plot(x,c, color="blue", linewidth=2.5, linestyle="-", label="cosine")
plot(x,s,color="red", linewidth=2.5, linestyle="-", label="sine")
show()

显示:
python plt pyplot type sincos

画散点图如下:

# 散点图
from pylab import *
n = 1024
X = np.random.normal(0,1,n)
Y = np.random.normal(0,1,n)
scatter(X,Y)
show()

显示:
python plt pyplot type scatter

画条形图如下:

#条形图
from pylab import *
n = 12
X = np.arange(n)
Y1 = (1-X/float(n)) * np.random.uniform(0.5,1.0,n)
Y2 = (1-X/float(n)) * np.random.uniform(0.5,1.0,n)
bar(X, +Y1, facecolor='#9999ff', edgecolor='white')
bar(X, -Y2, facecolor='#ff9999', edgecolor='white')
for x,y in zip(X,Y1):text(x+0.4, y+0.05, '%.2f' % y, ha='center', va= 'bottom')
ylim(-1.25,+1.25)
show()

显示:
python plt pyplot type bar

饼图如下:

#饼图
from pylab import *
n = 20
Z = np.random.uniform(0,1,n)
pie(Z)
show()

显示:
python plt pyplot type pie

画立体图如下:

#画三维图
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
from pylab import *
fig=figure()
ax=Axes3D(fig)
x=np.arange(-4,4,0.1)
y=np.arange(-4,4,0.1)
x,y=np.meshgrid(x,y)
R=np.sqrt(x**2+y**2)
z=np.sin(R)
ax.plot_surface(x,y,z,rstride=1,cstride=1,cmap='hot')
show()

显示:
python plt pyplot type Axes3D

画其他简单图形如下:

#更多简单的图形
x = [1,2,3,4]
y = [5,4,3,2]plt.figure()
plt.subplot(2,3,1)
plt.plot(x, y)plt.subplot(232)
plt.bar(x, y)plt.subplot(233)
plt.barh(x, y)plt.subplot(234)
plt.bar(x, y)
y1 = [7,8,5,3]
plt.bar(x, y1, bottom=y, color = 'r')plt.subplot(235)
plt.boxplot(x)plt.subplot(236)
plt.scatter(x,y)plt.show()

显示:
python plt pyplot type other

3.使用pandas画图

pandas中画图的主要类型包括:

  • 累和图
  • 柱状图
  • 散点图
  • 饼图
  • 矩阵散点图

先导入所需要的库:

from __future__ import division
from numpy.random import randn
import numpy as np
import os
import matplotlib.pyplot as plt
np.random.seed(12345)
from pandas import Series, DataFrame
import pandas as pd
%matplotlib inline

在pandas中,有行标签、列标签和分组信息等,如果使用matplotlib画图,可能需要一大堆的代码,现在调用Pandas的plot()方法即可简单实现。

画简单线图如下:

#线图 
s = Series(np.random.randn(10).cumsum(), index=np.arange(0, 100, 10))
s.plot()
plt.show()

显示:
python pandas type line series

pandas.Series.plot()的常见参数及说明如下:

参数说明
label用于图例的标签
ax要在其上进行绘制的matplotlib subplot对象,如果没有设置,则使用当前matplotlib subplot
style将要传给matplotlib的风格字符串,例如'ko-'
alpha图表的填充不透明(0-1)
kind可以是'line''bar''barh''kde'
logy在Y轴上使用对数标尺
use_index将对象的索引用作刻度标签
rot旋转刻度标签(0-360)
xticks用作X轴刻度的值
yticks用作Y轴刻度的值
xlimX轴的界限
ylimY轴的界限
grid显示轴网格线

Pandas的大部分绘图方法都有一个可选的ax参数,它可以是一个matplotlib的subplot对象,从而能够在网络布局中更为灵活地处理subplot的位置。DataFrame的plot方法会在一个subplot中为各列绘制一条线,并自动创建图例。

画多列线图如下:

df = DataFrame(np.random.randn(10, 4).cumsum(0),columns=['A', 'B', 'C', 'D'],index=np.arange(0, 100, 10))
df.plot()
plt.show()

显示:
python pandas type line dataframe

相对于Series,DataFrame还有一些用于对列进行灵活处理的选项,例如要将所有列都绘制到一个subplot中还是创建各自的subplot等,具体如下:

参数说明
subplots将各个DataFrame列绘制到单独的subplot中
sharex如果subplots=True,则共用同一个X轴,包括刻度和界限
sharey如果subplots=True,则共用同一个Y轴,包括刻度和界限
figsize表示图像大小的元组
title表示图像标题的字符串
legend添加—个subplot图例(默认为True)
sort_columns以字母表顺序绘制各列,默认使用前列顺序

画简单累和图如下:

#线图 CUM
plt.close('all')s = Series(np.random.randn(10).cumsum(), index=np.arange(0, 100, 10))
s.plot()
plt.show()

显示:
python pandas type cumsum series

画多列的类和图如下:

df = DataFrame(np.random.randn(10, 4).cumsum(0),columns=['A', 'B', 'C', 'D'],index=np.arange(0, 100, 10))
df.plot()
plt.show()

显示:
python pandas type cumsum dataframe

当提升了数据规模之后,累和图如下:

s = pd.Series([2, np.nan, 5, -1, 0])
print(s)print(s.cumsum())#画累和图
ts=pd.Series(np.random.randn(1000),index=pd.date_range('1/1/2000',periods=1000))
ts=ts.cumsum()
ts.plot()
plt.show()
df=pd.DataFrame(np.random.randn(1000,4),index=ts.index,columns=list('ABCD'))# cumulative意为累计、累积,这个函数可以返回一个累计值,经常会遇到月累计、年累计这种指标,会用这个函数
df=df.cumsum()
df.plot()
plt.show()

打印:

0    2.0
1    NaN
2    5.0
3   -1.0
4    0.0
dtype: float64
0    2.0
1    NaN
2    7.0
3    6.0
4    6.0
dtype: float64

显示:
python pandas type cumsum complex

画Series柱状图如下:

#柱形图
fig, axes = plt.subplots(2, 1)
data = Series(np.random.rand(16), index=list('abcdefghijklmnop'))
data.plot(kind='bar', ax=axes[0], color='r', alpha=0.7)
data.plot(kind='barh', ax=axes[1], color='g', alpha=0.7)
plt.show()

显示:
python pandas type bar series

DataFrame画柱状图:

df = DataFrame(np.random.rand(6, 4),index=['one', 'two', 'three', 'four', 'five', 'six'],columns=pd.Index(['A', 'B', 'C', 'D'], name='Genus'))df.plot(kind='bar') #图例plt.figure()df.plot(kind='barh', stacked=True, alpha=0.5)plt.show()

显示:
python pandas type bar dataframe

可以看到:
对于DataFrame,柱形图会将每一行的值分为一组;
DataFrame的各列名称都被用作了图例的标题;
设置stacked=True即可为DataFrame生成堆积柱形图,这样每行的值就会被堆积在一起。

餐馆小费数据如下:
python pandas type bar tipdata

进行数据可视化如下:

tips = pd.read_csv('tips.csv') # 各数据点的百分比
party_counts = pd.crosstab(tips.day, tips['size'])  #size聚会人数
print(party_counts)party_counts = party_counts.iloc[:, 2:5] # 选取一部分数据
print(party_counts)party_pcts = party_counts.div(party_counts.sum(1).astype(float), axis=0) # 转换成百分比, 1 代表维度 行的方向
print(party_pcts)
party_pcts.plot(kind='bar', stacked=True)   #每天的高度都是1
plt.show()

打印:

size  1   2   3   4  5  6
day                      
Fri   1  16   1   1  0  0
Sat   2  53  18  13  1  0
Sun   0  39  15  18  3  1
Thur  1  48   4   5  1  3
size   3   4  5
day            
Fri    1   1  0
Sat   18  13  1
Sun   15  18  3
Thur   4   5  1
size         3        4         5
day                              
Fri   0.500000  0.50000  0.000000
Sat   0.562500  0.40625  0.031250
Sun   0.416667  0.50000  0.083333
Thur  0.400000  0.50000  0.100000

显示:
python pandas type bar tipdata show

画较复杂的柱状图如下:

#画柱状图
df2 = pd.DataFrame(np.random.rand(10, 4), columns=['a', 'b', 'c', 'd'])
df2.plot(kind='bar') #分开并列线束
df2.plot(kind='bar', stacked=True) #四个在同一个里面显示 百分比的形式
df2.plot(kind='barh', stacked=True)#纵向显示
plt.show()
df4=pd.DataFrame({'a':np.random.randn(1000)+1,'b':np.random.randn(1000),'c':np.random.randn(1000)-1},columns=list('abc'))
df4.plot(kind='hist', alpha=0.5)
df4.plot(kind='hist', stacked=True, bins=20)
df4['a'].plot(kind='hist', orientation='horizontal',cumulative=True) #cumulative是按顺序排序
plt.show()
#Area Plot
df = pd.DataFrame(np.random.rand(10, 4), columns=['a', 'b', 'c', 'd'])
df.plot(kind='area')
df.plot(kind='area',stacked=False)
plt.show()

显示:
python pandas type bar dataframe complex

直方图histogram:
是一种可以对值频率进行离散化显示的柱状图。数据点被拆分到离散的、间隔均匀的面元中,绘制的是各面元中数据点的数量。
调用Series.hist()即可实现,在之后调用plot时加上参数kind='kde'即可生成一张密度图。

根据小费数据画直方图如下:

# 直方图--给小费占总费用的比例的分布图
plt.figure()tips['tip_pct'] = tips['tip'] / tips['total_bill']  # 增加一个新的列
tips['tip_pct'].hist(bins=50) # 分为50个区间 plt.figure()

显示:
python pandas type hist tipdata

在统计学中,核密度估计(KDE)是一种估计随机变量概率密度函数(PDF)的非参数方法,利用高斯核生成核密度估计图如下:

comp1 = np.random.normal(0, 1, size=200)  # N(0, 1)  模拟出 0,1 的正态分布数据 0,期望值, 1 方差值
comp2 = np.random.normal(10, 2, size=200)  # 10,期望值, 2 方差值  方差值大,跨度就大些
values = Series(np.concatenate([comp1, comp2]))
values.hist(bins=100, alpha=0.3, color='k', density=True)
values.plot(kind='kde', style='k--')

显示:
python pandas type hist kde

根据小费数据画密度图如下:

tips['tip_pct'].plot(kind='kde')  # 利用高斯核生成核密度估计图plt.figure()

显示:
python pandas type hist kde tipdata

散点图scatter plot:
是观察两个一维数据序列之间的关系的有效手段,研究两个变量的关系,特别是是否有线性或曲线相关性。matplotlib的scatter方法是绘制散布图的主要方法。利用plt.scatter()即可轻松绘制一张简单的散布图。pandas也提供了能从DataFrame创建散步图矩阵的scatter_matrix()方法,还支持在对角线上放置变量的直方图或密度图。

画简单散点图如下:

df = pd.DataFrame(np.random.rand(50, 4), columns=['a', 'b', 'c', 'd'])
df.plot(kind='scatter', x='a', y='b')
df.plot(kind='scatter', x='a', y='b',color='DarkBlue', label='Group 1')
plt.show()

显示:
python pandas type scatter simple

画散点矩阵图和直方图如下:

df = pd.DataFrame(np.random.randn(1000, 4), columns=['A','B','C','D'])
pd.plotting.scatter_matrix(df, alpha=0.2)

显示:‘
python pandas type scatter matrix hist

画三点矩阵图和密度图如下:

df = pd.DataFrame(np.random.randn(1000, 4), columns=['a', 'b', 'c', 'd'])
pd.plotting.scatter_matrix(df, alpha=0.2, figsize=(6, 6), diagonal='kde')
plt.show()

显示:
python pandas type scatter matrix kde

宏观经济数据macrodata.csv如下:
python pandas type scatter macrodata

读取和选取数据如下:

macro = pd.read_csv("macrodata.csv")
data = macro[['cpi', 'm1', 'tbilrate', 'unemp']]
trans_data = np.log(data).diff().dropna()
trans_data[-5:]
print(trans_data[-5:])
plt.figure()

打印:

          cpi        m1  tbilrate     unemp
198 -0.007904  0.045361 -0.396881  0.105361
199 -0.021979  0.066753 -2.277267  0.139762
200  0.002340  0.010286  0.606136  0.160343
201  0.008419  0.037461 -0.200671  0.127339
202  0.008894  0.012202 -0.405465  0.042560<Figure size 432x288 with 0 Axes><Figure size 432x288 with 0 Axes>

画散点图和散点矩阵图如下:

plt.scatter(trans_data['m1'], trans_data['unemp'])
plt.title('Changes in log %s vs. log %s' % ('m1', 'unemp'))pd.plotting.scatter_matrix(trans_data, diagonal='kde', color='k', alpha=0.3)
plt.show()

显示:
python pandas type scatter macrodata show

可以简单看出各经济变量之间是否存在关系。

画饼图示意如下:

#饼图
df = pd.DataFrame(3 * np.random.rand(4, 2), index=['a', 'b', 'c', 'd'], columns=['x', 'y'])
df.plot(kind='pie', subplots=True, figsize=(8, 4))
df.plot(kind='pie', subplots=True,autopct='%.2f',figsize=(8, 4)) # 显示百分比
plt.show()

显示:
python pandas type pie

4.pandas中绘图与matplotlib结合使用

有时候想方便地集成的绘图方式,比如df.plot(),但是又想加上matplotlib的很多操
作来增强图片的表现力,这时可以将两者结合。

构造数据如下:

df=pd.DataFrame(np.random.randn(3,4),index=list('123'),columns=list('ABCD'))
df2=pd.DataFrame(np.random.randn(4,4),index=list('1234'),columns=list('ABCD'))
display(df, df2)

显示:
python plt pandas combine data

可视化如下:

fig, axes = plt.subplots(2, 1)
df.plot(ax=axes[0])
df2.plot(ax=axes[1])
axes[0].set_title('3points')
axes[1].set_title('4points')

显示:
python plt pandas combine plot

三、订单数据分析展示

主要作图包括订单与GMV趋势、商家趋势、订单来源分布、类目占比,涉及折线图、饼图、堆积柱形图、组合图等类型,目标是综合使用pandas和matplotlib。

订单数据.csv如下:
python plt pandas practice order orderdata

导库和读取数据如下:

#导入库
import pandas as pd
import matplotlib.pyplot as plt# plt.rcParams['font.sans-serif'] = ['SimHei']  #显示中文标签
# plt.rcParams['axes.unicode_minus'] = False  #显示符号#读取数据
orders = pd.read_excel("订单数据.xlsx")
orders['付款时间'] = orders['付款时间'].astype('str')  #方便作图,将日期改为字符串格式

不同日期订单金额折线图如下:

#折线图
data1 = orders.groupby('付款时间')['支付金额'].sum()  #处理数据
x = data1.index   #x值
y = data1.values  #y值plt.title('GMV走势')  #图表标题
plt.plot(x,y,label='GMV',color='red')    #label是图例,color是线条颜色
plt.legend(loc=1)  #显示图例,loc设置图例展示位置,默认为0(最优位置)、1右上角、2左上角
plt.show()   #显示图

显示:
python plt pandas practice order line

可以看出不同时间订单金额的变化趋势,找出哪些天订单金额较高、哪些天较低。

还可以用柱状图显示:

#柱形图
data1 = orders.groupby('付款时间')['支付金额'].sum()  #处理数据
x = data1.index   #x值
y = data1.values  #y值plt.title('GMV走势')  #图表标题
plt.bar(x,y,label='GMV',color='green')    #其实很简单,只要把plot换成bar
plt.legend(loc=1)  #显示图例,loc设置图例展示位置,默认为0(最优位置)、1右上角、2左上角
plt.show()   #显示图

显示:
python plt pandas practice order bar

还可以用饼图直观看出各天所占的比例:

#饼图
data1 = orders.groupby('付款时间')['支付金额'].sum()  #处理数据
x = data1.index   #x值
y = data1.values  #y值plt.title('GMV饼图')  #图表标题
plt.axis('equal')   #正圆,饼图会默认是椭圆
plt.pie(y,labels=x,autopct='%1.1f%%',\colors=['green','red','skyblue','blue'])    #labels是标签,autopct是占比保留1位小数
plt.show()   #显示图

显示:
python plt pandas practice order pie

还可以为柱形图添加数据标签,如下:

# 为柱形图添加数据标签
data1 = orders.groupby('付款时间')['支付金额'].sum()  #处理数据
x = data1.index   #x值
y = data1.values  #y值plt.title('GMV走势')  #图表标题
plt.bar(x,y,label='GMV',color='green')    #label是图例,color是线条颜色
plt.legend(loc=1)  #显示图例,loc设置图例展示位置,默认为0(最优位置)、1右上角、2左上角
for a,b in zip(x,y):  #添加数据标签plt.text(a,b,'%d'%b,ha='center',va='bottom')  #在x,y的位置上添加订单数据 
plt.show()   #显示图

显示:
python plt pandas practice order bar text

工作中很常见柱形图与折线图的组合图形,但是两个指标的数量级往往不一致,如果只用一个纵坐标,可能数量级小的那个会看不到图,所以要用到主次坐标轴,如下:

#组合图形&主次坐标轴
data1 = orders.groupby('付款时间')[['支付金额','订单编号']].agg({'支付金额':'sum','订单编号':'count'})  #处理数据
x = data1.index   #x轴
y1 = data1['支付金额']  #y主轴数据
y2 = data1['订单编号']  #y次轴数据plt.title('订单&GMV走势')  #图表标题plt.bar(x,y1,label='GMV')  #GMV柱形图
plt.ylim(0,100000)   #设置y1的坐标轴范围
for a,b in zip(x,y1):  #添加数据标签plt.text(a,b+0.1,'%d'%b,ha='center',va='bottom')  #在x,y1+0.1的位置上添加GMV数据 , '%d'%y 即标签数据, ha和va控制标签位置
plt.legend(loc=1)  #显示图例,loc=1为右上角plt.twinx()  #次纵坐标轴
plt.plot(x,y2,label='订单数',color='red')  #订单折线图,红色
plt.ylim(-2100,2200) #设置y2的坐标轴范围
for a,b in zip(x,y2):  #添加数据标签plt.text(a,b+0.2,'%d'%b,ha='center',va='bottom')  #在x,y2+0.1的位置上添加订单数据 
plt.legend(loc=2)  #显示图例,loc=2为左上角

显示:
python plt pandas practice order bar line

需要注意:
纵坐标轴范围、图例、数据标签,需要在各自的纵坐标里设置,即先进行主纵坐标的设置,之后是次纵坐标。如果都放在后面去设置,那么text(x,y)的y位置,就都是次纵坐标了。

制作简单的数据仪表盘如下:

#制作数据仪表盘
plt.figure(figsize=(15,8))   #设置图的整体大小 #总共4个子图,用subplot()#第一个:每日订单与成交额走势,柱形图与折线图组合
data1 = orders.groupby('付款时间')[['支付金额','订单编号']].agg({'支付金额':'sum','订单编号':'count'})  #处理数据
x = data1.index   #x轴
y1 = data1['支付金额']  #y主轴数据
y2 = data1['订单编号']  #y次轴数据plt.subplot(2,2,1)   #2×2个子图:第一个
plt.title('订单&GMV走势')  #图表标题plt.bar(x,y1,label='GMV')  #GMV柱形图
plt.ylim(0,100000)   #设置y1的坐标轴范围
for a,b in zip(x,y1):  #添加数据标签plt.text(a,b+0.1,'%d'%b,ha='center',va='bottom')  #在x,y1+0.1的位置上添加GMV数据 , '%d'%y 即标签数据, ha和va控制标签位置
plt.legend(loc=1)  #显示图例,loc=1为右上角plt.twinx()  #次纵坐标轴
plt.plot(x,y2,label='订单数',color='red')  #订单折线图,红色
plt.ylim(-2100,2200) #设置y2的坐标轴范围
for a,b in zip(x,y2):  #添加数据标签plt.text(a,b+0.2,'%d'%b,ha='center',va='bottom')  #在x,y2+0.1的位置上添加订单数据 
plt.legend(loc=2)  #显示图例,loc=2为左上角#第二个:主要商家,每日GMV趋势。 多条折线图
#数据处理
data2 = pd.DataFrame(orders[orders['商家名称'].isin(['店铺3','店铺5','店铺6','店铺9'])].groupby(['商家名称','付款时间'])['支付金额'].sum())  
#店铺3、5、6、9的成交额
data2_tmp = pd.DataFrame(index=set(data2.index.get_level_values(0)),columns=set(data2.index.get_level_values(1)))for ind in data2_tmp.index:for col in data2_tmp.columns:data2_tmp.loc[ind,col] = data2.loc[ind,:].loc[col,'支付金额']plt.subplot(2,2,2)   #2×2个子图:第二个
plt.title('主要商家GMV趋势')
colors = ['green','red','skyblue','blue']  #设置曲线颜色
x = sorted(data2_tmp.columns)  #日期是横轴for i in range(len(data2_tmp.index)):plt.plot(x,data2_tmp.loc[data2_tmp.index[i],:],label=data2_tmp.index[i],color=colors[i])
plt.legend()  #显示图例,loc默认为0,即最优位置#第三个:订单来源端口,每日趋势。  堆积柱形图
#数据处理
data3_tmp = pd.DataFrame(orders.groupby(['平台来源','付款时间'])['支付金额'].sum())
data3 = pd.DataFrame(index=set(data3_tmp.index.get_level_values(0)),columns=set(data3_tmp.index.get_level_values(1)))
for ind in data3.index:print(ind)for col in data3.columns:data3.loc[ind,col] = data3_tmp.loc[ind,:].loc[col,'支付金额']barx = data3.columns
bary1 = data3.loc['android',:]
bary2 = data3.loc['iphone',:]plt.subplot(2,2,3)   #2×2个子图:第三个
plt.title('订单来源端口分布')   #底部是安卓,顶部是iPhone。先画iPhone=安卓+iPhone,再画安卓
plt.bar(barx,bary1+bary2,label='iphone',color='green')
plt.bar(barx,bary1,label='android',color='red') #底部是bar_y数据
plt.legend()  
for a,b,c in zip(barx,bary1,bary2):  #添加数据标签,注意:底部是安卓,即y1plt.text(a,1000,'%d'%b,ha='center',va='bottom')  #在a,1000的位置上,添加数据标签plt.text(a,b+c-1000,'%d'%c,ha='center',va='bottom')  #调整标签的位置#第四个:类目占比。 饼图#最近一天的类目金额
data4 = orders[orders['付款时间']==max(orders['付款时间'])].groupby('类目')['支付金额'].sum().sort_values()   plt.subplot(2,2,4)   #2×2个子图:第四个
plt.title('最近一天的类目占比')
plt.axis('equal')   #正圆,饼图会默认是椭圆
plt.pie(data4.values,labels=data4.index,autopct='%1.1f%%',\colors=['green','red','skyblue','blue'])  #显示百分数,1位小数
plt.show()

显示:
python plt pandas practice order four

过程稍复杂,需慢慢理解。

四、Titanic灾难数据分析显示

主要过程如下:

  • 导入必要的库
  • 导入数据
  • 设置为索引
  • 绘制展示男女乘客比例的扇形图
  • 绘制展示船票Fare与乘客年龄和性别的散点图
  • 生还人数
  • 绘制展示船票价格的直方图

数据titanicdata.csv如下:
python plt pandas practice titanic data

导库和读取数据如下:

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np%matplotlib inlinetitanic = pd.read_csv("titanicdata.csv")titanic.head()

显示:
python plt pandas practice titanic read

设置索引如下:

titanic.set_index('PassengerId').head()

显示:
python plt pandas practice titanic index

创建一个饼图,展示男性/女性的比例:

# sum the instances of males and females
males = (titanic['Sex'] == 'male').sum()
females = (titanic['Sex'] == 'female').sum()# put them into a list called proportions
proportions = [males, females]# Create a pie chart
plt.pie(# using proportionsproportions,# with the labels being officer nameslabels = ['Males', 'Females'],# with no shadowsshadow = False,# with colorscolors = ['blue','red'],# with one slide exploded outexplode = (0.15 , 0),# with the start angle at 90%startangle = 90,# with the percent listed as a fractionautopct = '%1.1f%%')# View the plot drop above
plt.axis('equal')# Set labels
plt.title("Sex Proportion")# View the plot
plt.tight_layout()
plt.show()

显示:
python plt pandas practice titanic pie

用所付费用和年龄创建散点图,按性别区分图的颜色:

# 创建绘图
lm = sns.lmplot(x = 'Age', y = 'Fare', data = titanic, hue = 'Sex', fit_reg=False)# set title
lm.set(title = 'Fare x Age')# 获取axes对象并对其进行调整
axes = lm.axes
axes[0,0].set_ylim(-5,)
axes[0,0].set_xlim(-5,85)

显示:
python plt pandas practice titanic scatter

查看幸存人数:

titanic.Survived.sum()

打印:

342

创建一个柱状图,显示已付车费:

# 将值从顶部到最小值排序,并对前5项进行切片
df = titanic.Fare.sort_values(ascending = False)# 使用numpy创建存储箱间隔
binsVal = np.arange(0,600,10)
binsVal# 创建绘图
plt.hist(df, bins = binsVal)# 设置标题和标签
plt.xlabel('Fare')
plt.ylabel('Frequency')
plt.title('Fare Payed Histrogram')# 展示绘图
plt.show()

显示:
python plt pandas practice titanic bar

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/198051.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

aliyun Rest ful api V3版本身份验证构造

aliyun Rest ful api V3版本身份验证构造 参考官网&#xff1a;https://help.aliyun.com/zh/sdk/product-overview/v3-request-structure-and-signature?spma2c4g.11186623.0.0.787951e7lHcjZb 构造代码 &#xff1a;使用GET请求进行构造&#xff0c;算法使用sha256 使用postm…

动手学深度学习——循环神经网络的从零开始实现(原理解释+代码详解)

文章目录 循环神经网络的从零开始实现1. 独热编码2. 初始化模型参数3. 循环神经网络模型4. 预测5. 梯度裁剪6. 训练 循环神经网络的从零开始实现 从头开始基于循环神经网络实现字符级语言模型。 # 读取数据集 %matplotlib inline import math import torchfrom torch import …

sqli-labs关卡20(基于http头部报错盲注)通关思路

文章目录 前言一、回顾上一关知识点二、靶场第二十关通关思路1、判断注入点2、爆数据库名3、爆数据库表4、爆数据库列5、爆数据库关键信息 总结 前言 此文章只用于学习和反思巩固sql注入知识&#xff0c;禁止用于做非法攻击。注意靶场是可以练习的平台&#xff0c;不能随意去尚…

【Linux】安全审计-audit

文章目录 一、audit简介二、开启auditd服务三、相关文件四、审计规则五、审计日志查询及分析附录1&#xff1a;auditctl -h附录2&#xff1a;systemcall 类型 参考文章&#xff1a; 1、安全-linux audit审计使用入门 2、audit详细使用配置 3、Linux-有哪些常见的System Call&a…

golang学习笔记——接口interfaces

文章目录 Go 语言接口例子空接口空接口的定义空接口的应用空接口作为函数的参数空接口作为map的值 类型断言接口值 类型断言例子001类型断言例子002类型断言例子003巩固练习 Go 语言接口 接口&#xff08;interface&#xff09;定义了一个对象的行为规范&#xff0c;只定义规范…

Java面向对象(高级)-- 类的成员之四:代码块

文章目录 一、回顾&#xff08;1&#xff09;三条主线&#xff08;2&#xff09;类中可以声明的结构及作用1.结构2.作用 二、代码块&#xff08;1&#xff09;代码块的修饰与分类1. 代码块的修饰2. 代码块的分类3. 举例 &#xff08;2&#xff09; 静态代码块1. 语法格式2. 静态…

【数据结构】栈与队列面试题(C语言)

我们再用C语言做题时&#xff0c;是比较不方便的&#xff0c;因此我们在用到数据结构中的某些时只能手搓或者Ctrlcv 我们这里用到的栈或队列来自栈与队列的实现 目录 有效的括号解题思路&#xff1a;代码实现&#xff1a; 用队列实现栈解题思路&#xff1a;代码实现&#xff1a…

4月2日-3日·上海 | 3DCC 第二届3D细胞培养与类器官研发峰会携手CGT Asia 重磅来袭

类器官&#xff08;Organoids&#xff09;作为干细胞研究领域最重要的成果之一&#xff0c;在基础医学研究、转化医学及药物研发领域展现出巨大的应用潜力&#xff0c;特别是在精准医疗以及药物安全性和有效性评价等方向凭借其先天优势引起了极大的市场关注&#xff0c;成为各大…

LabVIEW进行MQTT通信及数据解析

需求&#xff1a;一般通过串口的方式进行数据的解析&#xff0c;但有时候硬件的限制&#xff0c;没法预留串口&#xff0c;那么如何通过网络的方式特别是MQTT数据的通信及解析 解决方式&#xff1a; 1.MQTT通信控件&#xff1a; 参考开源的mqtt-LabVIEW https://github.com…

【iOS】——知乎日报第五周总结

文章目录 一、评论区展开与收缩二、FMDB库实现本地持久化FMDB常用类&#xff1a;FMDB的简单使用&#xff1a; 三、点赞和收藏的持久化 一、评论区展开与收缩 有的评论没有被回复评论或者被回复评论过短&#xff0c;这时就不需要展开全文的按钮&#xff0c;所以首先计算被回复评…

量化交易:借助talib使用技术分析指标

什么是技术分析&#xff1f; 所谓股票的技术分析&#xff0c;是相对于基本面分析而言的。基本分析法着重于对一般经济情况以及各个公司的经营管理状况、行业动态等因素进行分析&#xff0c;以此来研究股票的价值&#xff0c;衡量股价的高低。而技术分析则是透过图表或技术指标…

vulhub redis-4-unacc

环境搭建 cd vulhub/redis/4-unacc docker-compose up -d 漏洞复现 检测 redis-cli -h ip 使用redis工具 工具地址&#xff1a;https://github.com/vulhub/redis-rogue-getshell 下载完成后&#xff0c;先进入RedisModulesSDK/exp/ 目录进行make操作 获得exp.so后可以进行…

Jenkinsfile+Dockerfile前端vue自动化部署

前言 本篇主要介绍如何自动化部署前端vue项目 其中&#xff0c;有两种方案&#xff1a; 第一种是利用nginx进行静态资源转发&#xff1b;第二种方案是利用nodejs进行启动访问&#xff1b; 各个组件版本如下&#xff1a; Docker 最新版本&#xff1b;Jenkins 2.387.3nginx …

物联网AI MicroPython学习之语法 I2C总线

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; I2C 介绍 模块功能: I2C Master设备驱动 接口说明 I2C - 构建硬件I2C对象 函数原型&#xff1a;I2C(id, scl, sda, freq)参数说明&#xff1a; 参数类型必选参数&#xff1f;说明idintYI2C外设&#xff…

带你快速掌握Linux最常用的命令(图文详解)- 最新版(面试笔试常考)

最常用的Linux指令&#xff08;图文详解&#xff09;- 最新版 ls&#xff1a;列出目录中的文件和子目录&#xff08;重点&#xff09;cd&#xff1a;改变当前工作目录绝对路径&#xff1a;相对路径 pwd&#xff1a;显示当前工作目录的路径mkdir&#xff1a;创建一个新的目录tou…

【开源】基于Vue.js的音乐偏好度推荐系统的设计和实现

项目编号&#xff1a; S 012 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S012&#xff0c;文末获取源码。} 项目编号&#xff1a;S012&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、系统设计2.1 功能模块设计2.1.1 音乐档案模块2.1…

spring中的DI

【知识要点】 控制反转&#xff08;IOC&#xff09;将对象的创建权限交给第三方模块完成&#xff0c;第三方模块需要将创建好的对象&#xff0c;以某种合适的方式交给引用对象去使用&#xff0c;这个过程称为依赖注入&#xff08;DI&#xff09;。如&#xff1a;A对象如果需要…

代码随想录算法训练营Day 54 || 392.判断子序列、115.不同的子序列

392.判断子序列 力扣题目链接(opens new window) 给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符而不改变剩余字符相对位置形成的新字符串。&#xff08;例如&#xff0c;&quo…

多svn仓库一键更新脚本分享

之前分享过多git仓库一键更新脚本&#xff0c;本期就分享下svn仓库的一键更新脚本 1、首先需要设置svn为可执行命令行 打开SVN安装程序&#xff0c;选择modify&#xff0c;然后点击 command client tools&#xff0c;安装命令行工具 2、update脚本 echo 开始更新SVN目录&…

计算机视觉:使用opencv实现车牌识别

1 引言 汽车车牌识别&#xff08;License Plate Recognition&#xff09;是一个日常生活中的普遍应用&#xff0c;特别是在智能交通系统中&#xff0c;汽车牌照识别发挥了巨大的作用。汽车牌照的自动识别技术是把处理图像的方法与计算机的软件技术相连接在一起&#xff0c;以准…