03基本统计图形
常见统计图形
数据源
import pandas as pd
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
jddf = pd.read_csv('./data/data.csv', header=None,
names=['name', 'time', 'opening_price', 'closing_price', 'lowest_price', 'highest_price', 'volume'])
print(jddf.head(5))
# name time opening_price ... lowest_price highest_price volume
# 0 JD 3-Jan-17 25.95 ... 25.64 26.11 8275300
# 1 JD 4-Jan-17 26.05 ... 25.58 26.08 7862800
# 2 JD 5-Jan-17 26.15 ... 26.05 26.80 10205600
# 3 JD 6-Jan-17 26.30 ... 25.92 26.41 6234300
# 4 JD 9-Jan-17 26.64 ... 26.14 26.95 8071500
折线图
折线图(line)是由折线或曲线构成的图形。
一般由2个变量绘制,一个变量作为分析的变量,即途中线所代表的含义,另一个变量常常是定性变量或时间变量,作为分类变量或参照变量,用以考察分析变量的变动状况。折线图也可以同时考察多个变量的变动情况,并从中找出数据之间的关系
# 折线图
# 方法一:matplotlib
plt.plot(jddf['opening_price'])
plt.show()
# 添加区间阴影
meanop = jddf['opening_price'].rolling(5).mean() # 计算开盘价的5期移动平均
stdop = jddf['opening_price'].rolling(5).std()
plt.plot(range(71), jddf['opening_price'])
# 指定填充范围
plt.fill_between(range(71), meanop - 1.96 * stdop, meanop + 1.96 * stdop, color='b', alpha=0.2)
plt.show()
# 方法二:pandas
jddf = jddf.set_index('time')
# 更改横轴为time轴
jddf[['opening_price', 'closing_price']].plot(use_index=True, grid=True)
plt.show()
# 绘制两个轴
jddf['closing_price'].plot(use_index=True, grid=True)
jddf['volume'].plot(use_index=True, secondary_y=True, grid=True)
plt.show()
面积图
将折现图下方用不同颜色天长并堆积在一起,则可得到面积图(area plot) 。
面积图常常用来显示数据的构成或结构。
# 面积图
jddf[['opening_price', 'closing_price', 'highest_price', 'lowest_price']].plot.area(
ylim=(25, 35), stacked=False, cmap='tab10_r')
# stacked=True,则会把各折线对应的面积都堆叠在一起
plt.show()
直方图
直方图(histogram)是根据变量的取值来显示其频数分布的图形。
横轴代表数据分组,纵轴可用频数或百分比(频率)来表示,横纵轴的角色可以互换。对于等距分组的数据,矩形的高度即可直接代表频数的分布,而对于不等距分组的数据,则需要用矩形面积来表示各组的频数分布特征。
# 直方图
# 方法一:matplotlib
plt.hist(jddf['opening_price'], 10)
# 参数1为定量数据,参数2为划分的区间个数
plt.xlabel('Opening Price')
plt.ylabel('Frequency')
plt.title('Opening Price of JD Stock')
plt.show()
# 方法二:pandas
jddf['opening_price'].hist()
plt.show()
# 多个变量堆叠
jddf[['opening_price', 'closing_price']].plot(kind='hist', alpha=0.5, colormap='tab10_r', bins=8)
# bins用于指定直方的数目
plt.legend(loc=8, frameon=False, bbox_to_anchor=(0.5, -0.3))
plt.show()
# 指定分类变量表示按照其分类分别绘制图形
jddf[['opening_price', 'closing_price']].hist(by=jddf['Market'], stacked=True, bins=8, color=['gray', 'lightblue'])
plt.show()
条形图
条形图(bar chart)可以用来描述分类变量本身的分布状况,以及按照分类变量分组的其他变量的情况。
通常将图的横轴指定为数据的分组标志,纵轴则为频数、频率或百分比、其他变量的统计量等。通常情况下魅族标志都用相同宽度的条形表示,条形的长度等于观测数值的大小;在一些特殊情况下也可用宽度或面积不同的条形来表示分组情况。在绘图时,通常把条形分割开来以突出每组数据的独立性
# 条形图
# 方法一:matplotlib
N = 5 # 条形的数目
menMeans = (20, 35, 30, 35, 27)
womenMeans = (25, 32, 34, 20, 25)
menStd = (2, 3, 4, 1, 2)
womenStd = (3, 5, 2, 3, 3)
ind = np.arange(N) # 条形的编号
width = 0.45
p1 = plt.bar(ind, menMeans, width, color='grey', yerr=menStd)
p2 = plt.bar(ind, womenMeans, color='lightblue', bottom=menMeans, yerr=womenStd) # bottom指定堆叠的基准
plt.show()
# 方法二:pandas
salary['position'].value_counts().plot.bar(rot=0, colormap='summer')
龙卷风图
龙卷风图(tornado)实际上是两个柱状图或条形图拼叠在一起形成一个形如龙卷风样式的图形,因其图形酷似龙卷风而得名。
它可以对多维度变量在不同方面的表现进行对比分析,尤其适用于对一同一变量的不同测度水平值进行对比考察。其本质就是两个数据值方向相反的条形图进行叠加
# 龙卷风图
yt = ('student', 'employee', 'worker', 'manager', 'lawyer', 'driver', 'fireman', 'signer',
'composer', 'professor', 'journalist')
count_f = [78, 70, 90, 110, 80, 110, 150, 120, 196, 180, 220]
count_m = [-10, -21, -27, -34, -89, -84, -78, -90, -100, -123, -212]
plt.barh(range(11), count_f, color='r', alpha=0.5, label='female')
plt.barh(range(11), count_m, color='b', alpha=0.5, label='male')
plt.yticks(range(11), yt)
plt.xticks([-150, 150], ['male', 'female'])
plt.show()
饼图
饼图(pie chart)是一种用来描述定性数据频数或百分比的图形,通常以圆饼或椭圆饼的像是出现。
饼图的整个圆即代表一个整体的全部数据,圆中的一个扇形表示总体的一个类别,其面积大小由相应部分占总体的比例来决定,且各部分比例的加总必为100%。在统计分析中,主要用阿莱研究结构性问题。
# 饼图
# 方法一:matplotlib
from __future__ import division
sizes = {}
total = sum(gradeGroup.values())
explode = (0, 0.3, 0)
colors = ['yellowgreen', 'gold', 'lightskyblue']
for i in xt:
sizes[i] = gradeGroup[i] / total
plt.pie(sizes.values(), labels=sizes.keys(), explode=explode,
autopct='%1.2f%', colors=colors, shadow=True, startangle=45)
plt.show()
# 方法二:pandas
piedf = pd.DataFrame({'percent of position': [0.7707, 0.0573, 0.1720]}, index=['employee', 'director', 'manager'])
piedf['percent of position'].plot.pie(colors=colors, labeldistance=0.85, autopct='%1.2f%%', fontsize=12,
explode=explode, startangle=45)
piedf['percent of position'].plot.pie(kind='pie', labeldistance=0.85, autopct='%1.2f%%', fontsize=12,
explode=explode, startangle=45)
阶梯图
阶梯图(step)可以很好地反映变量的发展趋势,同事也体现该变量在其发展趋势中与别的变量之间的关系。
# 阶梯图
plt.hist(salary['salary'], 10, normed=True, histtype='step', cumulative=True)
# normed参数为是否无量纲化,histttype参数为step,表示绘制阶梯的曲线
# cumulative参数表示是否将所有数据累计起来放在阶梯的最后
plt.xlabel('current salary')
plt.ylabel('frequency')
plt.title('salary of US enterpriceses')
plt.show()
salay['salary'].plot.hist(bins=10, normed=True, histtype='step', cumulative=True)
plt.xlabel('current salary')
plt.ylabel('frequency')
plt.title('salary of US enterpriceses')
盒须图
盒须图(box-plot)是用一个类似盒子的图形来描述数据的分布状况的图形,有时也叫盒形图、盒式图或箱线图。
盒须图可显示出数据的如下特征值:最大值、最小值、中位数和上下四分位数。如果把多个盒须图并列起来,还可以考察不同变量或变量不同属性之间的离散程度和数据的平均水平
下四分位数:Q1,将所有数据按照从小到大的顺序排序排在第25%位置的数字
上四分位数:Q3,将所有数据按照从小到大的顺序排序排在第75%位置的数字
四分位距:IQR,等于Q3-Q1,衡量数据离散程度的一个统计量
异常点:小于Q1-1.5IQR或大于Q3+1.5IQR的值
上边缘:除异常点以外的数据中的最大值
下边缘:除异常点以外的数据中的最小值
# 盒须图
plt.boxplot(salary['salary'], 1, 'r', 0, labels=['current salary'])
plt.title('salary of US enterprises')
plt.show()
# 数据对比
plt.boxplot([salary['salary'], salary['begin_salary']])
plt.title('salary of US enterpriceses')
comninebox = plt.subplot(111)
comninebox.set_xticklabels(['current salary', 'begin_salary'])
plt.show()
小提琴图
默认情况下,盒须图将1.5倍内距的数据点显示为异常值。而小提琴图(violin)可以显示全部数据。
# 小提琴图
axes = plt.subplots(nrows=1, ncols=1, figsize=(8, 5))
vplot = plt.violinplot(jd_box_data, showmeans=False, showmedians=True)
colors = ['pink', 'lightblue', 'lightgreen', 'yellow']
for patch, color in zip(vplot['bodies'], colors):
patch.set_facecolor(color)
plt.grid(True) # 显示刻度线
plt.xticks([1, 2, 3, 4], ['opening_price', 'closing_price', 'highest_price', 'lowest_price'])
plt.show()
散点图
散点图(scatter)主要只用于考察两个变量之间的关系,广泛用与统计数据整理和建模过程中。
其主要特点就是分别用坐标轴的x轴和y轴来代表其所反映的变量,然后把每个数据点按照x轴和y轴所代表变量的值,绘制在二维坐标系中
# 散点图
# 方法一:matplotlib
plt.scatter(salary['salary'], salary['begin_salary'], c='darkblue', alpha=0.4)
plt.xlabel('current salary')
plt.ylabel('begin_salary')
plt.show()
# 方法二:pandas
salary.plot.scatter(x='salary', y='begin_salay', c='cyan', alpha=0.45)
# 两图叠加
sc1 = jddf.plot.scatter(x='opening_price', y='closing_price', c='blue', label='opening & closing')
jddf.plot.scatter(x='highest_price', y='lowest_price', c='red', label='highest & lowest', ax=sc1)
# ax参数表示把指定的sc1绘图对象叠加在本次所绘制的图形中
气泡图
气泡图(bubble)可视为散点图的延伸,即使用气泡来表示散点图中的数据点,这些气泡又可以反映除了横纵坐标轴之外的其他变量的数值大小,其数值越大,气泡就越大,反则反之。气泡图常用于3个变量之间的统计关系分析。
# 气泡图
colors = np.random(71) # 颜色数量应与数据观测数量一致
plt.scatter(jd_stock['opening_price'], jd_stock['closing_price'], marker='0',
c=colors, s=jd_stock['volume']/1000, alpha=0.6)
plt.xlabel('opening_price')
plt.ylabel('closing_price')
plt.show()
六边形箱图
六边形箱图(hexagnal bin plot)也叫蜂窝图,是一种利用二元直方图对大样本数据结构捷星可视化的有效形式。当数据过于密集而不能单独绘制每个点时是替代散点图的一个好的选择
# 六边形箱图
salary.plot.hexbin(x='salary', y='beign_salary', gridsize=25)
# gridsize控制x轴方向上的分箱数目
雷达坐标图
雷达坐标图(Radviz, radio coordinate visualization)是基于圆形平行坐标系的思想,将一系列多维空间的点通过非现行方法映射到二维空间的可视化技术。在高纬数据投影、海量数据投影、反映数据聚类信息等方面有较多应用,是一种多元数据可视化的重要方法。
# 雷达坐标图
from pandas.tools.plotting import radviz
fig = plt.fugure()
radviz(salary[['salary', 'begin_salary', 'age', 'education', 'jobtime', 'position']], 'position')
轮廓图
轮廓图(parallel coordinate plots)的横坐标上依次表示需要进行分析的各个变量,纵坐标则对应各个指标的值(或经过标准化变换后的值),然后将每一个数据在横坐标所表示的变量所对应的点依次用线条连起来。轮廓图能够展示数据在多个变量构成的不同维度的数据分布状况。
# 轮廓图
from pandas.tools.plotting import parallel_coordinates
parallel_coordinates(salary[['salary', 'begin_salary', 'jobtime', 'position']], 'position')
调和曲线图
调和曲线图(Andrews curves)的思想与傅里叶变换相似,时根据三角变换方法将高纬空间上的点映射到二维平面的曲线上。
# 调和曲线图
from pandas.tools.plotting import andrews_curves
andrews_curves(salary[['salary', 'begin_salary', 'jobtime', 'position']], 'position')
等高线图
等高线图(contour)常用于地理上的地形描述,在统计数据分析中也可用来描述数据的分布情况
# 等高线
from matplotlib import cm
u = np.linspace(-3, 3, 30)
x, y = np.meshgrid(u, u)
r = 0.6
mux = 0
muy = 0
sx = 1
sy = 1
z = (1 / (2 * 3.14 * sx * sy * np.sqrt(1 - r * r))) * np.exp((-1 / (2 * (1 - r * r))) * (
((x - mux) ** 2) / (sx ** 2) - 2 * r * (x - mux) * (y - muy) / (sx * sy) + ((y - muy) ** 2 / (sx ** 2))))
plt.contourf(x, y, z, alpha=0.35, cmap=cm.gist_earth)
C = plt.contour(x, y, z, colors='black')
plt.clabel(C, inline=1, fontsize=10)
plt.show()
极坐标图
极坐标图(polar)是在平面内由极点、极轴和极径组成的坐标系中绘制图形
# 极坐标图
N = 150
r = 2*np.random.rand(N)
theta = 2*np.pi*np.random.rand(N)
area = 200*r**2*np.random.rand(N)
colors = theta
ax = plt.subplot(111, projection='polar')
c = plt.scatter(theta, r, c=colors, s=area, cmap=plt.cm.hsv)
c.set_alpha(0.75)
plt.show()
词云图
词云图(word clouds)是由文字组成的图形,在文本数据挖掘中非常常见。
该图形绘制的一般过程是:先读入文本信息,然后进行分词(jieba/Yaha)和词频统计,最后用词云生成器(WordCloud/pytagcloud)绘制词云图
数据地图
将数据映射到对应区域地图上的数据地图(map)是也是可视化的常用手段。
python中一般可使用mpl_toolkits.basemap
中的Basemap绘制数据地图,但实际应用中旺旺需要对数据地图进行交互,可采用plotly
包来绘制交互式的数据地图