python——matplotlib提升应用plt.bar、plt.hist、plt.plot、plt.boxplot、plt.scatter

柱状图plt.bar

同一柱状图堆叠显示plt.pivot()+plt.bar(bottom=)

对于不同季度,不同产品的质量评价显示,先将使用的数据内容通过pd.pivot_table()进行数据筛选,重新设置了索引列和列标题(columns),再对数据使用柱状图显示

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

data=pd.read_csv(r'my_csv_date.csv',encoding='gbk')
print(data)
#解决中文乱码问题
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
plt.figure(figsize=(6.4,4.8))#设置图片背景的参数
print('下面是整理后的数据:==========')
#通过pivot_table函数重新提取数据两列作为(data)索引列和横向的列名(columns),另外的vlues对应的是数列,注意的是,尽量让索引是和数字有关的序列,可自动排序
over_view=pd.pivot_table(data=data,index='Q',columns='GOODS',values='QUA',aggfunc=np.sum)
print(over_view)
#使用tick_label对x轴的标签重新赋值
plt.bar(x= over_view.index.values,height=over_view.,color='green',tick_label=['第一季度','第二季度','第三季度','第四季度'] )
plt.bar(x= over_view.index.values,height=over_view.,bottom=over_view.,color='red')
plt.bar(x= over_view.index.values,height=over_view.,bottom=over_view.+over_view.,color='orange')
plt.xticks(rotation=45)	#x轴上的标签旋转45度
plt.ylabel('质量分数',fontsize=20,labelpad=20)
plt.show()

在这里插入图片描述
通过上边的程序和运行结果,得出一下几点注意,
1、索引尽量使用能够数字排序的字符,可自动排序,到最后只需使用plt.bar(tick_label=[ ])修改横坐标的标签字符即可
2、建立直方图时,使用的数据是自己处理后的变量索引和column,而且处理数据一般使用np.sum(),记录一类数量。
3、为了显示的图形不会出现遮挡,需要使用到plt.bar(bottom=),将想要放在下边的数据作为值传入,若不使用,每次图形的最低端都是以横轴开始计算,若出现完全遮挡,则图形无意义
上例中,每个季度,三个产品的服务质量评分。让季度和物品名称(甲乙丙)作为横纵参数,服务质量分数作为数据显示

同一柱状图堆叠显示plt.crosstab(nomalize=)+plt.bar(bottom=)

堆叠显示,对数据选择并单位化,可以明显看出,每个阶段数据量占的百分比
而且再使用bar绘制图形时,要设置label属性的值,否则,使用plt.legend时会出现问题
plt.legend()的显示位置不合适,可以通过plt.legend()中的bbox_to_anchor=(坐标),认为图形的右上角是(1,1),可设置(1.01,0.8)将内容注释放在图像外部

#前面和上个程序一样
over_view=pd.crosstab(data.Q,data.GOODS,normalize='index', values=data.QUA,aggfunc=np.sum,)
print(over_view)
plt.bar(x= over_view.index.values,height=over_view.,color='green',label='甲',tick_label=['第一','第二','第三','第四'] )
plt.bar(x= over_view.index.values,height=over_view.,bottom=over_view.,label='乙',color='red')
plt.bar(x= over_view.index.values,height=over_view.,label='丙',bottom=over_view.+over_view.,color='orange')
plt.xticks(rotation=45)#旋转横坐标标签
plt.ylabel('质量分数',fontsize=20,labelpad=20)
plt.legend(bbox_to_anchor=(1.01,0.8))
plt.show()

在这里插入图片描述
程序解析:这个程序及绘制的图形是通过pd.crosstab( )将数据的每一行(也就是index的每行)归一化

直方图plt.hist

正态分布函数,下面函数返回对应的计算正态频率值输出

def zhengtai_func(x,miu,sigma):
    zhen_y=np.exp(-(x-miu)**2/(2*(sigma**2)))/(sigma*np.sqrt(2*np.pi))
    return zhen_y

正态计算公式;
在这里插入图片描述

data=pd.read_csv(r'my_csv_date.csv',encoding='gbk')
print(data)
#解决中文乱码问题
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False

#删除数据中缺失项,计算数据的均值,标准差,和正态分布频率点
data.dropna(subset=['人数'],inplace=True)
print(data)
#x_mean=np.mean(data.人数) #与下一行数据功能相同
x_mean=data.人数.mean()
x_std=np.std(data.人数)
x=np.arange(data.人数.min(),data.人数.max(),0.1)
y=zhengtai_func(x,x_mean,x_std)

#显示直方图,核密度图,设置注释标签label                      
plt.hist(x=data.人数,bins=5,color='lightblue',label='年龄频率',\
         edgecolor='orange',density=True)
plt.plot(x,y,color='red',linewidth=3,label='正态分布线')
data.人数.plot(kind='kde',color="black",xlim=[0,10],label='核密度图')
plt.xlabel('不同年龄',fontsize=15,labelpad=20)
plt.title('年龄频率分布图',fontsize=25,pad=25)
plt.legend(loc='best')
plt.show()

在这里插入图片描述
程序及图形解析:
1、先定义了正态分布的概率计算,参数分别是,数据x,平均值x_mean,标准差x_std,返回计算的概率值,
2、然后读取数据,data.dropna( )删除缺失数据行,计算数据均值,标准差,取多个x值,通过正态公式显示成线,(使用数据的平均值和标准差就确定了数据的正态概率分布图)。
3、绘制直方图plt.hist( ),正态分布线plt.plot( x,y),核密度分布线data.plot(kind=‘kde’)、
4、核密度分布和正态分布区别:核密度分布和数据的每阶段的关系更大,正态分布确定了平均平均值和标准差后就确定了

箱图plt.boxplot()

参考:箱体知识参数知识
在这里插入图片描述
图片

plt.boxplot(x, notch=None, sym=None, vert=None, whis=None, positions=None, widths=None, patch_artist=None, bootstrap=None, usermedians=None, conf_intervals=None, meanline=None, showmeans=None, showcaps=None, showbox=None, showfliers=None, boxprops=None, labels=None, flierprops=None, medianprops=None, meanprops=None, capprops=None, whiskerprops=None, manage_xticks=True, autorange=False, zorder=None, hold=None, data=None)
**x:**指定要绘制箱线图的数据;
notch:是否是凹口的形式展现箱线图,默认非凹口;
sym:指定异常点的形状,默认为+号显示;
vert:是否需要将箱线图垂直摆放,默认垂直摆放;
whis:指定上下须与上下四分位的距离,默认为1.5倍的四分位差;
positions:指定箱线图的位置,默认为[0,1,2…];
widths:指定箱线图的宽度,默认为0.5;
**patch_artist:**是否填充箱体的颜色;
**meanline:**是否用线的形式表示均值,默认用点来表示;
**showmeans:**是否显示均值,默认不显示;
showcaps:是否显示箱线图顶端和末端的两条线,默认显示;
**showbox:**是否显示箱线图的箱体,默认显示;
showfliers:是否显示异常值,默认显示;
**boxprops:**设置箱体的属性,如边框色,填充色等;
labels:为箱线图添加标签,类似于图例的作用;
filerprops:设置异常值的属性,如异常点的形状、大小、填充色等;
**medianprops:**设置中位数的属性,如线的类型、粗细等;
**meanprops:**设置均值的属性,如点的大小、颜色等;
**capprops:**设置箱线图顶端和末端线条的属性,如颜色、粗细等;
whiskerprops:设置须的属性,如颜色、粗细、线的类型等;

data=pd.read_csv(r'my_csv_date.csv',encoding='gbk')
print(data)
#解决中文乱码问题
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False

plt.boxplot(x=data.人数,patch_artist=True,showmeans=True,meanline=True, boxprops={'facecolor':'green','color':'red'},\
            flierprops={'marker':'o','markerfacecolor':'red','markersize':20},\
           medianprops={'linestyle':'--','color':'orange'},\
           meanprops={'linestyle':'-','color':'blue'})
plt.xlabel('不同标号的人数',fontsize=15,labelpad=20)
plt.title('人数箱图',fontsize=25,pad=25)
# plt.legend(loc='best')
plt.show()

在这里插入图片描述
程序解释及图形描述,箱图能够明显的显示出离群点,箱子的显示框在分位数的25%-75%,下线:25%分数-1.5(75%分位数-25%分位数),上线:25%分数+1.5(75%分位数-25%分位数),

散点图plt.scatter

感谢鸢尾花数据
鸢尾花数据官方网址,下载或打开慢
为了展示两个连续型变量的关系,使用循环为每一个事物给不同的显示属性,注意数据的名称准确性

data=pd.read_csv(r'iris.csv',encoding='gbk')

# print(data)
#解决中文乱码问题
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False

#设置不同物种的颜色形状标记
species=['virginica','setosa','versicolor']
colors=['red','blue','orange']
marker=['o','s','x']

#给每个物种不同标记
for i in range(0,3):
    plt.scatter(x=data.Width[data.Species==species[i]],
                y=data.Length[data.Species==species[i]],
                color=colors[i],marker=marker[i],label=species[i])
plt.legend(loc='best')
plt.ylabel('花瓣长度',fontsize=15,labelpad=10)
plt.xlabel('花瓣宽度',fontsize=15,labelpad=10)
plt.title('三种鸢尾花数据',fontsize=20,pad=20)

plt.show()

在这里插入图片描述

折线图plt.plot()

显示数据的变化趋势

#设置图像大小和读取数据
fig=plt.figure(figsize=(8,7))
data=pd.read_csv(r'my_csv_date.csv',encoding='gbk')
print(data)

#解决中文乱码问题
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False

#设置第1列作为x的值,第3,4,5列作为对应的y值
plt.plot(data.iloc[:,0],data.iloc[:,2],'bs--',
        data.iloc[:,0],data.iloc[:,3],'ro--',
        data.iloc[:,0],data.iloc[:,4],'gh--',)

#修改折线图的横坐标名称,第一个参数是原始名称,第二个参数是新的名称
plt.xticks(range(0,12,1),data.iloc[range(0,12,1),1],rotation=45,fontsize=10)
plt.legend(loc='best')
plt.ylabel('数据值',fontsize=15,labelpad=10)
plt.xlabel('顺序',fontsize=15,labelpad=10)
plt.title('数据变化',fontsize=20,pad=20)

plt.show()

在这里插入图片描述
下面是对图像中线的描述,(程序和图像并不对应),图片中的参数正确

plt.legend(loc='best',frameon=False,ncol=1)
plt.legend(loc='best',frameon=True,ncol=1)
plt.legend(loc='best',frameon=False,ncol=3)

在这里插入图片描述

发布了70 篇原创文章 · 获赞 1 · 访问量 2414

猜你喜欢

转载自blog.csdn.net/weixin_43794311/article/details/105102003
plt
今日推荐