var code = "cddabbcd-a7ff-4fb4-9ea9-141865dec975"
一、图表辅助元素的定制
1.1 认识常用元素
标签 ---- label
文本 ---- text(注释|标签)
坐标轴 ---- 标签+刻度
1.2 设置坐标轴的标签、刻度范围、刻度标签
1.2.1 坐标轴的标签
xlabel 横轴标签
ylabel 纵轴标签
案例: 绘制正弦案例
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus']=False #显示负数
x = np.linspace(0,2*np.pi,500)
y = np.sin(x)
plt.plot(x,y)
plt.xlabel('弧度')
plt.ylabel('sin(x)')
plt.show()
1.2.2坐标轴刻度范围
x轴和y轴的刻度范围:xlim(min,max) ylim(min.max)
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus']=False #显示负数
x = np.linspace(0,2*np.pi,500)
y = np.sin(x)
plt.plot(x,y)
plt.xlabel('弧度') # 横坐标标签
plt.ylabel('sin(x)') # 纵坐标标签
plt.ylim(-1.5,1.5) # 设置y轴上下限数据(最小,最大)
plt.show()
如果使用画轴需要用下面方法
ax.set_xlabel(“弧度”) ###set_xlabel()
ax.set_ylabel(“sin(x)”) ###set_ylabel()
ax.set_ylim(-1.5,1.5)
1.2.3 刻度标签设置
刻度的定义:yticks 和 xticks
使用画轴之后
需要使用set_yticks 和 set_xticks
xticks([原有点的列表],[新定义的点的列表])
import matplotlib.pyplot as plt
import numpy as np
plt.figure()
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus']=False #显示负数
x = np.linspace(0,2*np.pi,500)
y = np.sin(x)
plt.plot(x,y)
plt.xlabel('角度') # 横坐标标签
plt.ylabel('sin(x)') # 纵坐标标签
plt.ylim(-1.2,1.2) # 设置y轴上下限数据(最小,最大)
plt.xticks([0,np.pi/2,np.pi,3*np.pi/2,np.pi*2],
['0°','90°','180°','270°','360°']) # 更改刻度标签
plt.show()
import matplotlib.pyplot as plt
import numpy as np
plt.figure()
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus']=False #显示负数
x = np.linspace(0,2*np.pi,500)
y = np.sin(x)
plt.plot(x,y)
plt.xlabel('角度') # 横坐标标签
plt.ylabel('sin(x)') # 纵坐标标签
plt.ylim(-1.2,1.2) # 设置y轴上下限数据(最小,最大)
plt.xticks([0,np.pi/2,np.pi,3*np.pi/2,np.pi*2],
['0',r'$\pi/2$',r'$\pi$',r'$3\pi/2$',r'$2\pi$']) # 更改刻度标签
plt.show()
1.3 标题和图例
1.3.1 标题
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus']=False #显示负数
x = np.linspace(0,2*np.pi,500)
y = np.sin(x)
fig = plt.figure(figsize=(12,4)) # 使用画布
ax = fig.add_subplot(111) # 使用画轴
ax.plot(x,y) # 在画轴上画图
ax.set_xlabel("弧度") ###set_xlabel()
ax.set_ylabel("sin(x)") ###set_ylabel()
ax.set_ylim(-1.2,1.2) # 设置y轴上下限数据(最小,最大)
ax.set_xticks([0,np.pi/2,np.pi,3*np.pi/2,np.pi*2],
['0',r'$\pi/2$',r'$\pi$',r'$3\pi/2$',r'$2\pi$']) # 更改刻度标签
ax.set_title("sin图表")
plt.show()
案例
数据格式
import matplotlib.pyplot as plt
import pandas as pd
import json
plt.rcParams['font.sans-serif'] = ['SimHei']
f = open('2020year.json','r',encoding='utf8')
data = json.load(f)
df = pd.DataFrame(data['data']['list'])
y = df['box'].astype('float')[:10]/10000 #转换类型,取前十个,并除以10000作为亿元单位
x = df['movieName'][:10]
plt.barh(x,y)
plt.title('2020年票房前十条形图')
plt.ylabel('电影名称')
plt.xlabel('总票房(亿元)')
plt.show()
1.3.3 图例
plt.legend() 或 ax.legend()
核心是:每个图都标记label,才能显示图例
不标记label就会显示为空
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/60d34e4bbafd4db7ac3560694faf17ab.png
其他属性
位置的设置:
legend(loc="upper right") 里面写位置参数
legend(bbox_to_anchor[x,y]) x和y表示图的坐标点
[0,0]表示图的左下
[0,1]表示图的左上
[1,0]表示图的右下
[1,1]表示图的右上
frameon=False 去掉方框
案例1
数据格式
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei']
data = pd.read_excel('第2章.xlsx',sheet_name='4-1')
y = data['平均成绩(男)']
y1 = data['平均成绩(女)']
x = np.arange(len(data))
plt.bar(x-0.2,y,width=0.4,label="平均成绩(男)")
plt.bar(x+0.2,y1,width=0.4,label="平均成绩(女)")
plt.xticks(x,data['学科'])
plt.legend()
plt.title('各科男女成绩')
plt.ylabel('成绩')
plt.xlabel('学科')
plt.show()
案例2
数据格式
import matplotlib.pyplot as plt
import pandas as pd
plt.rcParams['font.sans-serif'] = ['SimHei']
df = pd.read_excel('2-5.xlsx')
label = df['分类']
data = df['金额']
plt.pie(data,labels=label,autopct="%.2f%%",pctdistance=0.7)
plt.legend(bbox_to_anchor=[1.3,1.1])
plt.show()
1.4 网格线
grid(axis)
axis:默认值 both 或者改成 'x':根据x轴刻度画竖线
'y':根据y轴刻度画横线
案例1
数据格式
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei']
df = pd.read_excel('2-4.xls',index_col=0)
x = np.arange(len(df))
plt.bar(x-0.25,df['A公司'],width=0.25,label="A公司")
plt.bar(x,df['B公司'],width=0.25,label="B公司")
plt.bar(x+0.25,df['C公司'],width=0.25,label="C公司")
plt.xticks(x,df.index)
plt.ylabel('销售额')
plt.xlabel('月份')
plt.legend()
plt.grid(axis='y', # 网格,axis='y'按y轴刻度画网格
linestyle="-.",color="b", # 线的样式和颜色
linewidth=0.6,alpha=0.3) # 线的宽度和线的透明度(0是完全透明,1是不透明)
plt.show()
案例2
数据格式
import matplotlib.pyplot as plt
import pandas as pd
plt.rcParams['font.sans-serif'] = ['SimHei']
df = pd.read_excel('2-6.xls')
x = df['车速(km/h)']
y = df['制动距离(m)']
plt.scatter(x,y)
plt.title('汽车速度与制动距离关系')
plt.xlabel('速度(km/h)')
plt.ylabel('制动距离(m)')
plt.xticks(x)
plt.grid(linestyle="-.",color="r",linewidth=0.6,alpha=0.3)
plt.show()
1.5参考线
axhline ax是axis的缩写,h是水平的缩写
后面可以加上线的样式
axvline ax是axis的缩写,v是垂直的缩写
axhspan ax是axis的缩写,h是水平的缩写 span是区域
axvspan ax是axis的缩写,v是垂直的缩写 span是区域
案例
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus']=False # 用来显示负号
x = np.linspace(-(np.pi),np.pi)
y1 = np.sin(x)
y2 = np.cos(x)
plt.plot(x,y1,label='正弦')
plt.plot(x,y2,label='余弦')
plt.xlim(x.min()*1.5,x.max()*1.5)
plt.xticks([-np.pi,-np.pi/2,0,np.pi/2,np.pi],
[r'$-\pi$',r'$-\pi/2$',r'$0$',r'$\pi/2$',r'$\pi$'])
plt.xlabel('x轴')
plt.ylabel('y轴')
plt.title('正弦和余弦')
plt.legend()
plt.grid(axis='y')
plt.axhline(y=0.68,linestyle=":",alpha=0.5,color="r")
plt.axvline(x=-1,linestyle=":",alpha=0.5,color="g")
plt.axhspan(0,0.4,color="y",alpha=0.3)
plt.axvspan(0.2,1.5,color="g",alpha=0.3)
plt.show()
注释文本
指向性注释文本
annotate(s,xy,xytext)
必须写的参数,不需要写参数名
s是string的缩写:注释的文本内容(例如:最小值)。
xy是注释点的位置,箭头指向的点
xytext是书写文本的点。也是指向性箭头的起点
arrowprops:箭头的属性的字典
arrowprops={"arrowstyle":"-|>","color":"red","linestyle":"-."}
数字标签(无指向性注释文本)
优点:代码简单
缺点:一般都是很多个数据,需要用for循环画出来
text(x,y,s,其他参数)
x,y 写字点的坐标 s是 string 的缩写,写内容的
其他参数:horizotalalignment 水平对齐方式(缩写为ha)
verticalalignment 垂直对齐方式(缩写va)
对齐方式的值:"center" "left" "right"
"center" "top" "bottom" "baseline"
fontdict:字体的格式的定义
案例
数据格式
import matplotlib.pyplot as plt
import pandas as pd
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus']=False # 用来显示负号
df = pd.read_excel("2-2.xlsx")
plt.bar(df['财年'],df['GMV'])
plt.ylim(0,62000)
for i in range(len(df)):
plt.text(df['财年'][i],df['GMV'][i]+1200,df['GMV'][i],ha="center")
plt.show()
添加表格
table(cellText,rowLabels,colLabels,loc,colWidths,cellLoc)
必写:
cellText:表格中的数据的值,是二维数组的格式[[6,6,6],[8,8,8]]
如果表格只有一行或者一列,仍然是二维数据的格式
一行:[[200,600,100,600]]
一列:[[200],[600],[100],[600]]
rowLabels:每一行的标题,一维数组 ["第一行","第二行"]
colLabels:每一列的标题,一维数组 ["第1列","第2列","第3列"]
loc:表格显示的位置 ,默认填满整个底
colWidths
cellLoc
非必写:
案例
1. 复习1
数据格式
import matplotlib.pylab as plt
import pandas as pd
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.figure(figsize=(10,4))
df = pd.read_excel('9月份天气.xls')
plt.plot(df['日期'],df['最高气温'],"*--b",label="最高气温")
plt.plot(df['日期'],df['最低气温'],"X:y",label="最低气温")
plt.xlabel('9月份日期') #x轴标签
plt.ylabel('温度(°C)') #y轴标签
plt.title('9月4日~18日气温走势') #标题
plt.legend() #图例
plt.grid(alpha=0.4) #网格
plt.axhspan(ymin=20,ymax=28,alpha=0.3) #参考区域,需要使用透明度
for i in range(len(df)):
plt.text(df['日期'][i],df['最高气温'][i]+0.5,df['最高气温'][i],ha="center")
plt.text(df['日期'][i], df['最低气温'][i]+0.5, df['最低气温'][i], ha="center")
plt.annotate("最高温度",("6日",34),("6日",30),arrowprops={"arrowstyle":"-|>"})
plt.annotate("最高温度",("7日",34),("6日",30),arrowprops={"arrowstyle":"-|>"})
plt.annotate("最低温度",("15日",14),("15日",17),arrowprops={"arrowstyle":"-|>"})
plt.show()
复习2
import matplotlib.pylab as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei']
data = np.random.randint(1,10,100)
plt.hist(data,bins=(0,1,3,4,5,7,9,11),
color='r',alpha=0.4,edgecolor="black",label='y=nx')
plt.legend()
plt.show()
复习3
import matplotlib.pylab as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
lab=['面粉','砂糖','奶油','草莓酱','坚果']
data1=[40,15,20,10,15]
data2=[30,25,15,20,10]
plt.pie(data1,autopct="%.1f%%",pctdistance=0.85,labels=lab,
wedgeprops={"width":0.3,"edgecolor":"w"},
colors=['b','g','r','orange','pink']
)
plt.pie(data2,autopct="%.1f%%",pctdistance=0.75,radius=0.7,
wedgeprops={"width":0.3,"edgecolor":"w"},
colors=['b','g','r','orange','pink']
)
plt.legend(bbox_to_anchor=(0.95,0.9),title="ingredient ratio")
plt.show()