python-Matplotlib库

垂直柱状图 bar()

data = pd.read_excel(pth)
data.sort_values(by="分数",inplace=True,ascending=False)
# 图标中如需要显示中文,则定义中文类型,否则显示乱码
plt.rcParams["font.sans-serif"]=["Simhei"]
# 图中如果某个轴的数据要显示负数,设置如下.
plt.rcParams['axes.unicode_minus'] = False
plt.bar(x=data["姓名"],height=data["分数"],color="skyblue",label="分数成绩") #label是设定图例,需要用legend方法显示出来
plt.legend() #loc参数如下
''''
best'	0
'upper right'	1
'upper left'	2
'lower left'	3
'lower right'	4
'right'	5
'center left'	6
'center right'	7
'lower center'	8
'upper center'	9
'center'	10
'''
plt.xlabel("考生姓名")
plt.ylabel("考生成绩")
plt.xticks([i for i in range(0,9,2)],rotation = 45)
plt.ylim(-20,max(data["分数"])+20)
plt.title(label="一年级考试成绩",fontdict={"fontsize":16,"fontweight":"bold"})
#字体参数可以用上面字典模式,也可以用下面的单个参数赋值模式
plt.title(label="一年级考试成绩",fontsize=16,fontweight="bold")
plt.show()

分组柱形图,


原理其实很简单,先生成6部影片的第一天数据,然后在往右偏移一点距离生成第二天的数据,3~5天重复,
第一天的偏移距离为0,第二天的偏移距离为0+偏移距离,第二天的偏移距离为0+偏移距离*2,3~5天重复
在下面代码中,我们对每天生成的柱形图设置自身宽度为0.2,每一天的票房数据间隔为0.1

plt.rcParams["font.sans-serif"]=["Simhei"]
# 图中如果某个轴的数据要显示负数,设置如下.
plt.rcParams['axes.unicode_minus'] = False
# 如果对柱形宽度和偏移概念不深,可以尝试修改偏移为0.2试试
width = 0.2
space = 0.1
plt.bar(data["影片名"],data["第一天票房"],width=width,label="day1")
plt.bar([i+(space*1) for i in range(len(data["影片名"]))],data["第二天票房"],width=width,label="day2")
plt.bar([i+(space*2) for i in range(len(data["影片名"]))],data["第三天票房"],width=width,label="day3")
plt.bar([i+(space*3) for i in range(len(data["影片名"]))],data["第四天票房"],width=width,label="day4")
plt.bar([i+(space*4) for i in range(len(data["影片名"]))],data["第五天票房"],width=width,label="day5")
plt.legend()
# xticks第一个参数代表了每个
plt.xticks([i+(space*2) for i in range(len(data["影片名"]))],data["影片名"].values.tolist())
plt.show()


优化版: 上面如果需要5天的票房比较,重复了5次.试着用循环遍历plt.bar()

plt.rcParams["font.sans-serif"]=["Simhei"]
# 图中如果某个轴的数据要显示负数,设置如下.
plt.rcParams['axes.unicode_minus'] = False
# 如果对柱形宽度和偏移概念不深,可以尝试修改偏移为0.2试试
width = 0.2
space = 0.1
rows_num = data.iloc[0,:].shape[0]
for j in range(1,rows_num):
    plt.bar([i+(space*j) for i in range(len(data["影片名"]))],data.iloc[:,j], width=width,label="day%i"%(j))
plt.legend()
# xticks第一个参数代表了每个
plt.xticks([i+(space*(rows_num/2)) for i in range(len(data["影片名"]))],data["影片名"].values.tolist())
plt.show()

叠加柱状图 barh 额外学习plt.text()和plt.legend(ncol参数)

  • plt.legend(loc="upper center",ncol=3) 默认图标是上下叠放,ncol代表图标水平排列,排成3列
  • plt.text()参数如下,主要是用来在柱状图内写文字的,x,y是坐标 第三参数str是输入的文字

    对下面的图标来做一个柱状图堆叠案例吧
plt.rcParams["font.sans-serif"]=["Simhei"]
# 图中如果某个轴的数据要显示负数,设置如下.
plt.rcParams['axes.unicode_minus'] = False
#data.shape 是(9,4),除去表头是9行4列,那么科目是3列
plt.bar(x=data["姓名"].values.tolist(),height=data["语文"],label="语文成绩")
plt.bar(x=data["姓名"].values.tolist(),height=data["数学"],label="语文成绩",bottom=data["语文"])
plt.bar(x=data["姓名"].values.tolist(),height=data["英语"],label="语文成绩",bottom=data["语文"]+data["数学"])
plt.legend(loc="upper center",ncol=3)

for i,j in enumerate(data["语文"]):
    plt.text(i,j-20,"语文:"+str(j),ha="center",va="bottom")

for i,j in enumerate(data["数学"]):
    plt.text(i,j+data["语文"][i]-20,"数学:"+str(j),ha="center",va="bottom")

for i,j in enumerate(data["英语"]):
    plt.text(i,j+data["数学"][i]+data["语文"][i]-20,"英语"+str(j),ha="center",va="bottom")
plt.show()

横向柱状图(条形图) barh

plt.rcParams["font.sans-serif"]=["Simhei"]
# 图中如果某个轴的数据要显示负数,设置如下.
plt.rcParams['axes.unicode_minus'] = False
plt.barh(y=data["姓名"],width=data["分数"],height=0.5,label = "成绩分数")
plt.legend(loc="best")
plt.ylabel(ylabel="学生名",rotation = 15)
plt.xlabel(xlabel="成绩")
plt.title(label="一年级考试成绩",fontsize=16,fontweight="bold")
plt.show()

折线图 plot


#显示中文
plt.rcParams["font.sans-serif"]=["Simhei"]
# 图中如果某个轴的数据要显示负数,设置如下.
plt.rcParams['axes.unicode_minus'] = False
plt.plot(data["时间"],data["蔬菜"],marker=".",color="r",markersize =10,label="蔬菜")
plt.plot(data["时间"],data["水果"],marker=".",color="g",markersize =10,label="水果")
plt.plot(data["时间"],data["食品"],marker=".",color="b",markersize =10,label="食品")
plt.plot(data["时间"],data["用品"],marker=".",color="y",markersize =10,label="用品")
plt.legend()
plt.show()

饼图 pie

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

plt.rcParams["font.sans-serif"]=["Simhei"]
# 图中如果某个轴的数据要显示负数,设置如下.
plt.rcParams['axes.unicode_minus'] = False
print(data)
plt.pie(x=data["第一次"],explode=(0,0,0.1),labels=data["姓名"],autopct="%.2f%%",pctdistance=0.6,startangle=0)
plt.show()

可以通过radius, 画出双层饼图

plt.rcParams["font.sans-serif"]=["Simhei"]
# 图中如果某个轴的数据要显示负数,设置如下.
plt.rcParams['axes.unicode_minus'] = False
print(data)
plt.pie(x=data["第一次"],explode=(0,0,0.1),labels=data["姓名"],autopct="%.2f%%",pctdistance=0.6,startangle=0)
plt.pie(x=data["第二次"],explode=(0,0,0),labels=data["姓名"],autopct="%.2f%%",pctdistance=0.3,startangle=20,radius=0.6,labeldistance=0.6)
# 将饼图显示为正圆形,plt.axis( )
plt.axis('equal')

plt.legend()
plt.show()

图例 legend()

plt.legend(loc="upper right",fontsize=10,bbox_to_anchor=(1.1,1.05),borderaxespad=0.3,ncol=3)
bbox_to_anchor=[0.5, 0.5] # 外边距 上边 右边
ncol=2 分两列
borderaxespad = 0.3图例的内边距

画布和子图的概念,创建一个折线和柱状图的案例

# 显示中文
plt.rcParams["font.sans-serif"]=["Simhei"]
# 图中如果某个轴的数据要显示负数,设置如下.
plt.rcParams['axes.unicode_minus'] = False
# background = plt.figure(figsize=(100,80),dpi=8)
background = plt.figure()
first_obj = background.add_subplot(221)
#想在第几个子图生成效果图,就在下面写代码即可
sec_obj = background.add_subplot(222)
plt.plot(data["班级"],data["销售量"],label="销售量",marker="*",color="r")
plt.plot(data["班级"],data["毛利率"],label="毛利率",marker="*",color="g")
plt.plot(data["班级"],data["毛利率2"],label="毛利率2",marker="*",color="b")
plt.legend(loc="upper right")
third_obj = background.add_subplot(223)
# 这个例子是在第二个和第四个子图中生成趋势图
four_obj = background.add_subplot(224)
width=0.3
plt.bar(x=[i for i in range(data["班级"].shape[0])],height=data["销售量"],width=0.3,label="销售量")
plt.bar(x=[i+width for i in range(data["班级"].shape[0])],height=data["毛利率"],width=0.3,label="毛利率")
plt.bar(x=[i+(width*2) for i in range(data["班级"].shape[0])],height=data["毛利率2"],width=0.3,label="毛利率2")
plt.xticks([i+width for i in range(data["班级"].shape[0])],data["班级"])
plt.legend(loc="upper left")
plt.show()

创建子图有3中方法

  1. background = plt.figure() first_obj = background.add_subplot(221)
  2. 还可以plt直接创建plt.subplot(221)
  3. 用subplots创建多个子图

自定义子图的位置
上面的子图创建的是固定的位置,如果需要子图创建自定义的位置,通过add_axes对子图的坐标位置进行自定义

plt.rcParams["font.sans-serif"]=["Simhei"]
# 图中如果某个轴的数据要显示负数,设置如下.
plt.rcParams['axes.unicode_minus'] = False
fig = plt.figure()
left,bottom,width,height = 0.1,0.1,0.8,0.8
pic1 = fig.add_axes([left,bottom,width,height])  # 定义pic1的自定义位置
pic1.bar(data["姓名"],data["分数"],label="分数")
pic1.set_title("分数柱状图")
left,bottom,width,height = 0.6,0.6,0.2,0.2
pic2 = fig.add_axes([left,bottom,width,height])
pic2.plot(data["姓名"],data["分数"],label="分数")  # 定义pic2的自定义位置
pic2.set_title("分数折线图")
plt.legend()
plt.show()

平均线 axhline

plt.rcParams["font.sans-serif"]=["Simhei"]
# 图中如果某个轴的数据要显示负数,设置如下.
plt.rcParams['axes.unicode_minus'] = False

plt.bar(x=data["姓名"],height=data["第一次"],label="第一次")
平均线=numpy.mean(data["第一次"])
plt.axhline(y=平均线,color="b",linestyle = ":")
plt.legend(fontsize=10,bbox_to_anchor=(0.8,1.3),borderaxespad=0.1,ncol=3)
plt.show()

原文地址:https://www.cnblogs.com/Young-shi/p/15227540.html