(三)Matplotlib数据可视化

案例数据:https://cloud.189.cn/t/aYbUv2JbEzUn

一、Matplotlib绘图区域

绘图时,一般包括从大到小三个层次:画板、画布、绘图区。窗口是画板,Figure是绘制对象,Axes是绘图区。一个绘制对象中可以包含多个Axes子图,每个Axes都拥有自己坐标系的绘图区域。

可以使用plt.gcf(get   current   figure)获取当前绘制对象,plt.gca(get    current Axes)获取当前绘图区域,plt.sca(set   current   figure)设置当前操作的绘图区域。

1.1 创建绘图对象

  • fugure(num=None,figsize=None,dip=None,facecolor=None,...) 
  • num:图像编号或者名称
  • figsize:图像的宽和高,单位为英寸(1英寸=2.54cm)
  • dip:指定绘图对象的分辨率,即每英寸多少个像素

1.2 创建单个子图

  • subplot(nrows,ncols,index,**kwargs)
  • nrows:总行数
  • ncols:总列数
  • index:从左到右、从上到下指定编号。如果nrows、ncols、index三个参数都小于10,可以去掉都好,如222 

1.3 示例

fig = plt.figure(figsize=(10,8))
fig.suptitle("test1")
ax1 = plt.subplot(221)
ax1.set_title("test221")
ax1.plot([1,2,3,4,5],[4,8,12,16,20])

ax2 = plt.subplot(222)
ax2.plot([5,4,3,2,1])

ax3 = plt.subplot(223)
ax3.plot([1,2,3,3,3])

ax4 = plt.subplot(224)
ax4.plot([5,4,3,3,3])

二、汉字、负号显示问题 

plt.figure(figsize=(6,4))
# 中文显示问题
plt.rcParams['font.sans-serif']=['SimHei']
plt.text(0,0,u'这是一个测试')

# 负号显示问题
plt.rcParams['axes.unicode_minus']=False

三、常见图形

3.1 散点图

# 设置图片大小
plt.rcParams['figure.figsize']=8,6
# 设置画板颜色
sns.set_palette(sns.color_palette("muted"))

# 随机生成50个点,x轴取值范围0-20
x = np.random.rand(50)*20

# 随机生成50个点,y轴取值范围0-10
y = np.random.rand(50)*10

plt.plot(x,y,'o')

3.2 气泡图

# 生成50个点
N = 50
x = np.random.rand(N)
y = np.random.rand(N)

# 点的颜色
colors = np.random.rand(N)
# 点的半径
area = (30*np.random.rand(N))**2
# alpha:透明度0.5
plt.scatter(x,y,s=area,c=colors,alpha=0.5)
plt.show()

3.3 线图

t = np.arange(0.0, 2.0, 0.1)
s = np.sin(t*np.pi)

plt.plot(t,s,'r--',label='aaaa')
plt.plot(t*2, s, 'b--', label='bbbb')
plt.xlabel('x')
plt.ylabel('y')
plt.title('test')
# legend  图例  说明
plt.legend()

3.4 小提琴图

类似于箱线图,除了最大值、最小值和中位数,它两侧的曲线还描述了概率密度

data = np.random.rand(20,5)
plt.violinplot(data,showmedians=True,showmeans=False)

3.5 柱状图

# 导入包
import  pandas as pd
import seaborn as  sns
import numpy as np
import matplotlib.pyplot as plt
# 读取数据
df=pd.read_csv("./data/HR.csv")
s = df["salary"]
df.head(4)
# 柱状图
plt.title("SALARY")
plt.xlabel("salary")
plt.ylabel("count")

# 添加横轴的标注
plt.xticks(np.arange(len(s.value_counts()))+0.5,s.value_counts().index)

# 设置x轴和y轴最小值、最大值
plt.axis([0,4,0,10000])

# bar(x坐标int或者float,条形的高度int或者float,线条的宽度0-1)
plt.bar(np.arange(len(s.value_counts()))+0.5,s.value_counts(),width=0.5)

for x,y in zip(np.arange(len(s.value_counts()))+0.5,s.value_counts()):
        plt.text(x,y,y,ha="center",va="bottom")
    
plt.show()

 

# seaborn绘柱状图
# 设置背景颜色
sns.set_style(style="darkgrid")
plt.rcParams['figure.figsize']=6,6
# 设置字体、字体大小等
sns.set_context(context="poster",font_scale=0.8)
# 设置调色板
# sns.set_palette("spring")
sns.set_palette(sns.color_palette("RdBu",n_colors=7))
sns.countplot(x="salary",data=df)

'''
plt.rcParams['font.sans-serif']=['SimHei'] # 用来显示中文标签
plt.rcParams['axes.unicode_minus']=False # 用来显示负号
plt.rcParams['figure.figsize'] = (16.0, 10.0) # 调整生成的图表最大尺寸
'''
# 设置图片大小
# hue多层绘制
plt.rcParams['figure.figsize']=10,8
sns.countplot(x="salary",hue="department",data=df)

 

3.6 直方图

# 去除异常值
df=df.dropna(how="any",axis=0)
df=df[df["last_evaluation"]<=1][df["salary"]!="nme"][df["department"]!="sale"]

# 直方图
f = plt.figure()
f.add_subplot(1,3,1)
# distplot(kde=False):不显示包围曲线
# distplot(hist=False):不显示直方图
sns.distplot(df["satisfaction_level"],kde=False,bins=10)
f.add_subplot(1,3,2)
sns.distplot(df["last_evaluation"],bins=10)
f.add_subplot(1,3,3)
sns.distplot(df["average_monthly_hours"],bins=10)
plt.show()

3.7 箱线图

#箱线图
sns.boxplot(y=df["last_evaluation"],saturation=0.75)
plt.show()

3.8 折线图

# 折线图
# 第一种画法
# sub_df=df.groupby("time_spend_company").mean()
# sns.pointplot(x=sub_df.index,y=sub_df["left"])

# 另一种画法
sns.pointplot(x="time_spend_company",y="left",data=df)

3.9 饼图

# lables标签
lbs=df["department"].value_counts().index
# explode:离开整体,如果某个区域等于sales,离开0.1倍的间隔
explodes=[0.1 if i=="sales" else 0 for i in lbs ]

# autopct:显示百分比,精度小数点后一位
plt.pie(df["department"].value_counts(normalize=True),explode=explodes,autopct='%1.1f%%',colors=sns.color_palette("Reds", n_colors=7),labels=lbs)
plt.show()

猜你喜欢

转载自blog.csdn.net/qq_29644709/article/details/114697327