数据可视化_matplotlib

# 设置cell多行输出

from IPython.core.interactiveshell import InteractiveShell 
InteractiveShell.ast_node_interactivity = 'all' #默认为'last'

# 导入相关库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import warnings
import os

warnings.filterwarnings('ignore')
os.chdir(r'E:\python_learn\data\data_for_kaggle')
file_name = 'kaggle_bike_train.csv'
data = pd.read_csv(file_name)
data.head()
data.isna().sum().sum()  # 无缺失
data.info()
0



<class 'pandas.core.frame.DataFrame'>
RangeIndex: 10886 entries, 0 to 10885
Data columns (total 12 columns):
datetime      10886 non-null object
season        10886 non-null int64
holiday       10886 non-null int64
workingday    10886 non-null int64
weather       10886 non-null int64
temp          10886 non-null float64
atemp         10886 non-null float64
humidity      10886 non-null int64
windspeed     10886 non-null float64
casual        10886 non-null int64
registered    10886 non-null int64
count         10886 non-null int64
dtypes: float64(3), int64(8), object(1)
memory usage: 1020.6+ KB
data['datetime']=pd.to_datetime(data['datetime'])
data['month'] = data['datetime'].dt.month
data['weekday'] = data['datetime'].dt.weekday_name.str[:4]
data.head()
data.info()
image.png

柱状图 → plt.plot(kind='bar')/plt.bar()

柱状图:是一种以长方形的长度为变量的统计图表。长条图用来比较两个或以上的价值(不同时间或者不同条件),只有一个变量,通常利用于较小的数据集分析。

适用场景:适用场合是二维数据集(每个数据点包括两个值x和y),但只有一个维度需要比较,用于显示一段时间内的数据变化或显示各项之间的比较情况。

优势:柱状图利用柱子的高度,反映数据的差异,肉眼对高度差异很敏感。

劣势:柱状图的局限在于只适用中小规模的数据集。

data_m = data.groupby('month').mean()['count']  # 按月统计租车量
# 柱状图绘制按月统计租车量count

# 单系列柱状图
data_m.plot(kind='bar',color='r',alpha=0.5,width=0.8,figsize=(12,8),rot=45)  # data_m 为series,series.plot()
plt.title('单系列柱状图',fontsize=18,pad=12)  # 设置标题
plt.ylabel('y轴标签设置')    # 设置y轴标签,x轴标签→plt.xlabel()
plt.grid(True,ls='--',lw=0.8,alpha=0.5,color='gray',axis='y')  # 设置网格,axis='y',只显示y轴网格,默认xy都显示
plt.ylim([0,300])  # 设置y轴标尺的范围

for x,y in zip(range(len(data_m)),data_m):
    plt.text(x,y,'%.f'%y,ha='center',va='bottom',fontsize=12)  # 给柱状图添加文字注释
output_6_16.png
# 多系列柱状图
data_m_2 = data.groupby('month',as_index=False).mean()[['casual','registered']]
data_m_2.plot(kind='bar',figsize=(12,8),width=0.8)

for i,j in zip(range(len(data_m_2)),data_m_2['casual']):
    plt.text(i-0.2,j+3,'%.f'%j,color='black',ha='center',va='center_baseline',fontsize=12)
for i,j in zip(range(len(data_m_2)),data_m_2['registered']):
    plt.text(i+0.2,j+2,'%.f'%j,color='black',ha='center',va='center_baseline',fontsize=12)

plt.legend(loc=0) # 设置图例,loc=0自定适配位置
plt.title('多系列柱状图',fontsize=18,pad=12)

柱状图延申图表

条形图 → plt.plot(kind='barh')

条形图:是用宽度相同的条形的高度或长短来表示数据多少的图形,与柱状图类似,条形图纵置就是柱状图

适用场景:显示各个项目之间的比较情况,和柱状图类似的作用

优势:每个条都清晰表示数据,直观;易于比较数据之间的差别

# 条形图绘制按月统计租车量count
data_m.plot(kind='barh',figsize=(12,8),alpha=0.5,width=0.8,color='b')
plt.xlabel('count')
plt.title('柱状图延申图-条形图',fontsize=18,pad=12)

# 给条形图标注文字注释略有不同
for x,y in zip(data_m,range(len(data_m))):
    plt.text(x,y,'%.f'%x,ha='left',va='center',fontsize=12,color='r')  # 给柱状图添加文字注释

堆叠图 → plt.plot(kind='bar/barh',stacked=True)

堆叠图:显示单个项目与整体之间的关系。

优势:堆叠图能够使人们一眼看出各个数据的大小,易于比较数据之间的差别。利用条状的长度,反映数据的差异,肉眼对长短差异很敏感,可以使得数据更加直观,且堆叠图不仅仅可以直观的看出每个系列的值,还能够反映出系列的总和,尤其是当需要看某一单位的综合以及各系列值的比重时,最适合使用堆叠图。

# 垂直堆叠
data_m_2.plot(kind='bar',stacked=True,figsize=(12,8),alpha=0.7)
plt.xlabel('month')
plt.ylabel('count')
plt.title('柱状图延伸图-堆叠图',fontsize=18,pad=12)
for i,j in zip(range(len(data_m_2)),data_m_2['casual']):
    plt.text(i,j,'%.f'%j,color='black',ha='center',va='top',fontsize=12)
for i,j in zip(range(len(data_m_2)),data_m_2['registered']):
    plt.text(i,j,'%.f'%j,color='black',ha='center',va='center_baseline',fontsize=12)
# 水平堆叠
data_m_2.plot(kind='barh',stacked=True,figsize=(12,8),alpha=0.7,width=0.7)
plt.xlabel('month')
plt.ylabel('count')
plt.title('柱状图延伸图-堆叠图',fontsize=18,pad=12)

for i,j in zip(data_m_2['casual'],range(len(data_m_2))):
    plt.text(i,j,'%.f'%i,color='black',ha='right',va='center',fontsize=12)
for i,j in zip(data_m_2['registered'],range(len(data_m_2))):
    plt.text(i,j,'%.f'%i,color='black',ha='left',va='center',fontsize=12)
u = data_m.mean()
plt.axvline(u,ls='--',c='b',lw=1,alpha=0.8,) # 添加垂直辅助线
plt.text(u,0,'%.2f'%u,color='blue',fontsize=14,bbox=dict(facecolor='yellow', alpha=0.5))

折线图 → plt.plot(kind='line')

折线图:折线图可以显示随时间而变化的连续数据,因此非常适用于显示在相等时间间隔下数据的趋势。

适用场景: 折线图适合二维的大数据集,还适合多个二维数据集的比较。

优势:容易反应出数据变化的趋势。

# 折线图绘制按月统计租车量count

data_m.plot(figsize=(8,6),style='bo--')  # 设置style可同时设置线段颜色,标记,和线段样式,但必须把颜色写在最前面
u = data_m.mean()
plt.xlim([1,12])
plt.axhline(u,ls='--',c='r',lw=0.8,alpha=0.5,) # 添加水平辅助线
plt.text(data_m.index[-1]+0.2,u,'%.2f'%u,color='r',fontsize=14)  # 标注
plt.title('折线图',fontsize=18,pad=12)
data_m_2.plot(figsize=(8,6),style='x--')
plt.legend(loc=0)
ma = data_m_2['registered'].max()
plt.grid(True,linestyle='--',linewidth=0.5,color='gray',axis='y',alpha=0.5)
plt.text(data_m_2.index[5],ma,'%.2f'%ma,fontsize=12,bbox=dict(facecolor='red', alpha=0.5))  # 标注某个点
plt.title('折线图',fontsize=18,pad=12)

直方图 → plt.hist()

直方图:又称质量分布图,是一种统计报告图,一般用横轴表示数据类型,纵轴表示分布情况。

适用场景:观察数据集的分布情况

优势:直观观察数据形状,突出显示数据的中心趋势,确定数据样本的分布是对称还是偏斜

# 直方图绘制temp
data['temp'].hist(bins=30,figsize=(8,6),edgecolor='black')
# bins,设置箱子数量
# edgecolor,设置边框颜色

plt.title('直方图',fontsize=18,pad=12)
data['temp'].hist(bins=30,figsize=(8,6),density=True)
# 参数density是关键,y轴会按百分比表示
# density=False,表示决定将y轴的取值范围落在某个箱子中的元素的个数,即系y轴表示频率次数
# density=True,表示决定将y轴的取值范围落在某个箱子中的元素的个数占总体的百分比,即系y轴表示百分比
plt.grid(False)
plt.title('直方图',fontsize=18,pad=12)

data['temp'].plot(kind='kde',color='r')  # 密度图在直方图参数density=True时,和直方图一起使用

饼图 → plt.pie()

适用场景:显示各项的大小与各项总和的比例。适用简单的占比比例图,在不要求数据精细的情况适用。

优势:明确显示数据的比例情况,尤其合适渠道来源分析等场景。

劣势:数据类别较多时不适用

参数:
x :(每一块)的比例,如果sum(x) > 1会使用sum(x)归一化;
labels :(每一块)饼图外侧显示的说明文字;
explode :(每一块)离开中心距离;
startangle :起始绘制角度,默认图是从x轴正方向逆时针画起,如设定=90则从y轴正方向画起;
shadow :在饼图下面画一个阴影。默认值:False,即不画阴影;
labeldistance :label标记的绘制位置,相对于半径的比例,默认值为1.1, 如<1则绘制在饼图内侧;
autopct :控制饼图内百分比设置,可以使用format字符串或者format function
'%1.1f'指小数点前后位数(没有用空格补齐);
pctdistance :类似于labeldistance,指定autopct的位置刻度,默认值为0.6;
radius :控制饼图半径,默认值为1;
counterclock :指定指针方向;布尔值,可选参数,默认为:True,即逆时针。将值改为False即可改为顺时针。
wedgeprops :字典类型,可选参数,默认值:None。参数字典传递给wedge对象用来画一个饼图。例如:wedgeprops={'linewidth':3}设置wedge线宽为3。
textprops :设置标签(labels)和比例文字的格式;字典类型,可选参数,默认值为:None。传递给text对象的字典参数。
center :浮点类型的列表,可选参数,默认值:(0,0)。图标中心位置。
frame :布尔类型,可选参数,默认值:False。如果是true,绘制带有表的轴框架。
rotatelabels :布尔类型,可选参数,默认为:False。如果为True,旋转每个label到指定的角度。

user_count = data[['casual','registered']].sum()
user_count
casual         392135
registered    1693341
dtype: int64
plt.figure(figsize=(8,6))
explode = [0.1,0]
labels = user_count.index
plt.pie(user_count,explode=explode,autopct='%.2f%%',labels=labels,pctdistance=1.3,labeldistance=0.5,)
# explode,距离圆中心的距离
# labels,(每一块)饼图外侧显示的说明文字
# autopct在饼图中,显示百分数
plt.title('饼图',fontsize=18,pad=12)

面积图 → plt.stackplot()

适用场景:强调数量随时间而变化的程度,也可用于引起人们对总值趋势的注意

data_stack = data.groupby('month').mean()[['casual','registered','count']]
x = data_stack.index
y = data_stack['casual']
y1 = data_stack['registered']
y2 = data_stack['count']
plt.figure(figsize=(12,6))
plt.stackplot(x,y,y1,y2,alpha=0.6,labels=data_stack.columns)
plt.xlim([1,12])
plt.title('面积图',fontsize=18,pad=12)
plt.legend(loc=0)

散点图 → plt.scatter(x,y)

适用场景:显示若干数据系列中各数值之间的关系,类似XY轴,判断两变量之间是否存在某种关联。散点图适用于三维数据集,但其中只有两维需要比较。

优势:对于处理值的分布和数据点的分簇,散点图都很理想。如果数据集中包含非常多的点,那么散点图便是最佳图表类型。

劣势:在点状图中显示多个序列看上去非常混乱。

x = np.random.rand(1000)
y = np.random.randn(1000)*10
plt.figure(figsize=(8,6))
plt.scatter(x,y,color='r',alpha=0.5)
plt.title('散点图',fontsize=18,pad=12)

散点图延伸图

气泡图 → plt.scatter(x,y,s)

气泡图:是可用于展示四个变量之间的关系。它与散点图类似,绘制时将一个变量放在横轴,另一个变量放在纵轴,而第三个变量则用气泡的大小来表示,第四个变量用气泡颜色深浅来表示。气泡图与散点图相似,不同之处在于:气泡图允许在图表中额外加入一个表示大小的变量进行对比。

plt.scatter(x,y,s)的参数:
x,y 输入数据
s,用于调整点的大小,形成气泡图
c,用于调整颜色的深浅

x = np.random.randn(1000)
y = np.random.randn(1000)
plt.figure(figsize=(12,8))
plt.scatter(x,y,s=np.random.randn(1000)*100,c=y,cmap='Blues',edgecolor='black',alpha=0.5)
plt.title('气泡图',fontsize=18,pad=12)

散点矩阵图 → pd.scatter_matrix()

df = pd.DataFrame(np.random.randn(100,4),columns=list('ABCD'))
pd.scatter_matrix(df,figsize=(12,12),marker='o',diagonal='kde',range_padding=0.1)
# diagonal='hist' 设置对角线图表形式,默认直方图hist,kde为密度图
# range_padding=0.1,图像在x轴、y轴原点附近的留白(padding),该值越大,留白距离越大,图像远离坐标原点

箱线图 → plt.boxplot()/plt.plot.box()

箱型图:是一种用作显示一组数据分散情况资料的统计图。主要用于反映原始数据分布的特征,还可以进行多组数据分布特征的比较。箱线图作用非常广泛,可检测异常值以及用于观察数据形状、偏态和尾重。

# plt.boxplot()
df = pd.DataFrame(np.random.rand(10, 5), columns=['A', 'B', 'C', 'D', 'E'])
plt.figure(figsize=(10,4))
# 创建图表、数据

f = df.boxplot(sym = 'o',  # 异常点形状,参考marker
               vert = True,  # 是否垂直
               whis = 1.5,  # IQR,默认1.5,也可以设置区间比如[5,95],代表强制上下边缘为数据95%和5%位置
               patch_artist = True,  # 上下四分位框内是否填充,True为填充
               meanline = False,showmeans=True,  # 是否有均值线及其形状
               showbox = True,  # 是否显示箱线
               showcaps = True,  # 是否显示边缘线
               showfliers = True,  # 是否显示异常值
               notch = False,  # 中间箱体是否缺口
               return_type='dict'  # 返回类型为字典
              ) 
plt.title('箱线图A',fontsize=18,pad=12)
# plt.boxplot()箱线图分组汇总
season = data[['season','casual','registered']]
season.boxplot(by='season',figsize=(12,12),sym='+')
# plt.plot.box()
df.plot.box(figsize=(8,6),sym='+')
plt.title('箱线图B',fontsize=18,pad=12)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,902评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,037评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,978评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,867评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,763评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,104评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,565评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,236评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,379评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,313评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,363评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,034评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,637评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,719评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,952评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,371评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,948评论 2 341

推荐阅读更多精彩内容