数据分析基础之图表展示

384 阅读4分钟
参与拿奖:本文已参与「新人创作礼」活动,一起开启掘金创作之路

1.折线图

1.1 单一折线图

import numpy as  np
import pandas as pd
#方法一
import matplotlib.pyplot as plt
#确保打印图片
%matplotlib inline
x=np.linspace(0,100,1000)
y=np.sin(x) # 构造函数
plt.plot(x,y,c='red',lw=2,ls='-') 
plt.show()

image.png


plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
plt.plot(x,y,c='red',lw=2,ls=':',markersize=10,label='y=sin(x)')
plt.legend(loc='center')
plt.show()

image.png

x=np.arange(0,1.1,0.01)
y=x**2
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
#figsize调整画布大小,dpi调整分辨率
plt.figure(figsize=(6.4,4.84),dpi=100,facecolor='white')
plt.title('picture')
#标签
plt.xlabel('x')
plt.ylabel('y')
#刻度
plt.xlim([0,1])
plt.ylim([0,1])
plt.plot(x,y,label='y=2^x')
plt.legend(loc='upper left')
plt.show()

image.png

1.2 多折线图

#折线图(主要用于时序)
fig=plt.figure(figsize=(7,8))
plt.plot(data.iloc[:,0],data.iloc[:,3],'bs--',
        data.iloc[:,0],data.iloc[:,4],'ro--',
        data.iloc[:,0],data.iloc[:,5],'gH--',)
plt.xlabel('顾客账号')
plt.ylabel('变化趋势')
plt.xticks(range(0,10,4),data.iloc[range(0,10,4),1],rotation=45,fontsize=10)
plt.legend(['gender','SeniorCitizen','Partner'],bbox_to_anchor=[1.01,0.5])
plt.show()

image.png

1.3 双坐标轴

#绘制多个图形
data=pd.read_csv(r'Customer-Churn.csv')
data=data.sample(100)
#data
#绘制双坐标轴
data_1=data.groupby('tenure').mean()
fig=plt.figure(figsize=(4,6))
ax1=fig.add_subplot(111)
ax1.plot(data_1.index,data_1.MonthlyCharges,label='月消费',color='blue')
ax1.set_ylabel('不同阶层月消费情况')
plt.legend(loc='upper left')

ax2=ax1.twinx()
ax2.plot(data_1.index,data_1.SeniorCitizen,color='red',label='是否成年')
ax2.set_ylabel('是否成年公民')
plt.legend(loc='upper center')
plt.xlabel('不同阶层')
plt.show()

image.png

2.饼状图

import numpy as np
import pandas as pd
data=pd.read_csv(r'Customer-Churn.csv')
#data.head(5)
data1=data.groupby('gender').mean()['MonthlyCharges']
x_data1=data1.values
y_data1=data1.index

explode=[0,0.1]
colors=['red','orange']
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
plt.pie(x=x_data1,explode=explode,colors=colors,labels=y_data1,autopct='%.1f%%',pctdistance=0,labeldistance=1.1,
       startangle=120,radius=1.2,counterclock=False,wedgeprops={'linewidth':1.5,'edgecolor':'black'})
#plt.legned('')
plt.show()

image.png

3.柱状图

3.1 单一柱状图

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
#条形图
x_data=data1.values
y_labels=data1.index
plt.bar(x=range(0,len(x_data)),height=len(x_data),align='center',color='blue',tick_label=y_labels)
plt.xlabel('性别')
plt.ylabel('数量')
plt.title('性别数量')
plt.show()

image.png

3.2 多柱状图

#设置中文显示格式
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
#data1=data.groupby('gender').mean()['MonthlyCharges']
#确保打印图片
data=data.sample(10)
%matplotlib inline
#MonthlyCharges=data['MonthlyCharges']
#设置画布
plt.figure(figsize=(6,6))
#data.index.values
plt.bar(x=data.index.values,height=data.tenure,width=1)
plt.xticks(data.index.values,data.gender.values,rotation=45)
plt.title('tenure',fontsize=20)
plt.xlabel('gender',fontsize=20)
plt.ylabel('tenure',fontsize=20,labelpad=20)
plt.show()

image.png

3.3 叠加柱状图

#绘制叠加柱状图
#透视表
temp=pd.pivot_table(data=data,index='gender',columns='PaymentMethod',values='MonthlyCharges',aggfunc=np.sum)
temp


plt.bar(x=temp.index.values,height=temp['Bank transfer (automatic)'],color='blue',
        label='Bank transfer (automatic)',bottom=temp['Credit card (automatic)'],tick_label=['女性','男性'])

plt.bar(x=temp.index.values,height=temp['Credit card (automatic)'],color='yellow',
        label='Credit card (automatic)',tick_label=['女性','男性'])

plt.bar(x=temp.index.values,height=temp['Electronic check'],color='red',
        label='Electronic check',bottom=temp['Credit card (automatic)'],tick_label=['女性','男性'])
plt.ylabel('支付方式')
plt.title('支付方式')
plt.legend(loc='best')
plt.show()

image.png

4.散点图

4.1 单一散点图

plt.scatter(y=data['MonthlyCharges'],x=data['tenure'],color='blue',marker=0,s=100)
plt.ylabel('MonthlyCharges')
plt.xlabel('tenure')
plt.title('MonthlyCharges-tenure')
plt.show()

image.png

4.2 多散点图

#散点图
plt.figure(figsize=(4,4))
#plt.scatter(x=data.gender,y=data.tenure,s=4,color='blue')
colors=['blue','red']
sex=['Male','Female']
markers=['o','s']
for i in range(0,2):
    plt.scatter(x=data.gender[data['gender']==sex[i]],y=data.tenure[data['gender']==sex[i]],color=colors[i],
               marker=markers[i],label=sex[i])
plt.legend(loc='best')
plt.xlabel('gender',fontsize=12,labelpad=20)
plt.ylabel('tenure',fontsize=12,labelpad=20)
plt.show()

image.png

5.箱线图

plt.boxplot(x=data['MonthlyCharges'],
            patch_artist=True,showfliers=True,showmeans=True,
            boxprops={'color':'red','facecolor':'blue'},
            flierprops={'marker':'o','markerfacecolor':'red','markersize':5},
            meanprops={'marker':'D','markerfacecolor':'yellow','markersize':4},
            medianprops={'linestyle':'--','color':'blue'}
           )

image.png

6.混合图像

6.1 折线+柱状图

data.dropna(subset=['MonthlyCharges'],inplace=True)
#直方图
#正态分布
def normFunc(x,mu,sigma):
    pdf=np.exp(-((x-mu))**2)/(2*sigma*2)/(sigma*np.sqrt(2*np.pi))
    return pdf
#均值
mean_x=data['MonthlyCharges'].mean()
#方差
std_x=data['MonthlyCharges'].std()

x=np.arange(data['MonthlyCharges'].min(),data['MonthlyCharges'].max()+10,1)

y=normFunc(x,mean_x,std_x)

#直方图
plt.hist(x=data['MonthlyCharges'],bins=50,color='blue',density=True)
#折线
plt.plot(x,y,color='yellow',linewidth=3,label='正态分布图')
data['MonthlyCharges'].plot(kind='kde',color='red',xlim=[0,90],label='核密度图')
plt.xlabel('月消费',fontsize=20,labelpad=20)
plt.ylabel('频率',fontsize=20)
plt.title('月消费分布图')
plt.show()

image.png

6.2 双图展示


plt.figure(figsize=(16,8))
plt.subplot2grid((2,3),(0,0),colspan=1,rowspan=2)
plt.plot(data['Contract'],data['MonthlyCharges'],c='c')
plt.xlabel('合同年限')
plt.ylabel('月消费额')
plt.xticks(rotation=45)

plt.subplot2grid((2,3),(0,1),colspan=2,rowspan=1)
plt.bar(x=data.Contract,height=data.MonthlyCharges,color='blue')
plt.xticks(rotation=45)

plt.subplot2grid((2,3),(1,1),colspan=2,rowspan=1)
plt.hist(x=data['Contract'],bins=20,color='r',density=True)
plt.xticks(rotation=45)

plt.suptitle('不同图形展示')
plt.show()

image.png

6.3 三图展示

plt.figure(figsize=(16,8))
plt.subplot2grid((2,3),(0,0),colspan=1,rowspan=2)
plt.plot(data['Contract'],data['MonthlyCharges'],c='c')
plt.xlabel('合同年限')
plt.ylabel('月消费额')
plt.xticks(rotation=45)

plt.subplot2grid((2,3),(0,1),colspan=2,rowspan=1)
plt.bar(x=data.Contract,height=data.MonthlyCharges,color='blue')
plt.xticks(rotation=45)

plt.subplot2grid((2,3),(1,1),colspan=2,rowspan=1)
plt.hist(x=data['Contract'],bins=20,color='r',density=True)
plt.xticks(rotation=45)

plt.suptitle('不同图形展示')
plt.show()

image.png

7.引入seaborn

import seaborn as sns
import seaborn
#柱状图 sns.barplot(x,y)
#散点图 sns.scatter(x,y)
#箱线图 sns.boxplot()
#直方图 sns.distplot()
#折线图 sns.lineplot()
#回归图 sns.lmplot()
#计数图 sns.countplot()


sns.set(style='darkgrid',context='notebook',font_scale=1.2)
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
plt.bar(x=data.gender.values,height=data.MonthlyCharges,tick_label=data.gender,color='blue')
plt.ylabel('月消费额度')
plt.xlabel('性别')
plt.show()

image.png

#垂直
plt.figure(figsize=(8,8))
sns.barplot(x='gender',y='MonthlyCharges',data=data,color='lightblue',orient='vertical')
#躺平
#sns.barplot(x='MonthlyCharges',y='gender',data=data,color='lightblue',orient='h')
male=0
l_male=0
l_female=0
female=0

for i in data.index.values:
    if data['gender'][i]=='Male':
        male+=data['MonthlyCharges'][i]
        l_male+=1
    else:
        female+=data['MonthlyCharges'][i]
        l_female+=1
    
for x,y in enumerate([female/l_female,male/l_male]):
    plt.text(x,y+0.1,'%s元'%round(y,1),ha='center',fontsize=18)
plt.show()

image.png

import seaborn
import seaborn as sns

sns.set(style='darkgrid',context='notebook',font_scale=1.2,palette='colorblind')
sns.countplot(x='gender',data=data,hue='tenure')
plt.show()

image.png

#双坐标轴
import plotly as py
import pandas as pd
import numpy as np
import plotly.graph_objs as go
import matplotlib as plt

plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
pyplot=py.offline.iplot
data=pd.read_csv(r'Customer-Churn.csv')
data=data.sample(10)

#双坐标轴
trace0=Scatter(x=data['tenure'],y=data['MonthlyCharges'],mode='markers',name='月消费')
trace1=Scatter(x=data['tenure'],y=data['SeniorCitizen'],mode='lines',name='公民',yaxis='y2')
data=[trace0,trace1]
layout=go.Layout(title='消费变化',xaxis=dict(title='等级'),yaxis=dict(title='月消费'),
                 yaxis2=dict(title='是否公民',overlaying='y',side='right'),
                 legend=dict(x=0.1,y=0.1,font=dict(size=12,color='blue')))
fig=go.Figure(data=data,layout=layout)
pyplot(fig)

image.png

参考资料

[1] 本节代码