这部分主要时讲画饼状图和柱状图
一、柱状图
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams['font.sans-serif']=['SimHei'] #防止出现中文乱码,加上这句
GDP =value_max20 #柱子的数值
plt.figure(figsize=(20,20))
# 绘图
plt.bar(range(20), GDP, align = 'center',color='steelblue', alpha = 0.8) #画20个柱子,数据来自GDP,中心对齐,颜色蓝色,透明度0.8
# 添加轴标签
plt.ylabel('销售数量',fontsize=20) #y轴的标签名
# 添加标题
plt.title('2018-2020年车厂销售情况') #标题
# 添加刻度标签
plt.xticks(range(20),dic_max20,rotation=270,fontsize=20) #x轴刻度标签,20个刻度,数据来自dic_max20,旋转270°,字体大小20
# 设置Y轴的刻度范围
#plt.ylim([5000,15000])
# 为每个条形图添加数值标签 enumerate可以同时获得索引和值
for x,y in enumerate(GDP):
plt.text(x,y+100,'%s' %round(y,1),ha='center')#在柱子上标文字,按照GDP列表的大小进行循环,第一个x代表获取的是GDP的横坐标,y代表的是获取GDP的竖坐标,y+100代表在竖坐标基础上加100,
#显示的文字就是%round(y,1),中心对齐
plt.show()# 显示图形
效果
这是画单个柱状图的情况,如果要画分组的柱状图,例如想画三个组,每个组都有3个或者5个柱子,每组之间分开,又是不一样的画法。
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
import matplotlib as mpl
mpl.rcParams['font.sans-serif']=['SimHei'] # 防止中文乱码
color=['grey','gold','darkviolet','turquoise','r','g','b','c','m','y'] #颜色代码
labels = ['2018年', '2019年', '2020年'] # x轴坐标名称
count_2018 = [5.48, 3.78, 3.25] #原始数据
count_2019 = [6.04, 5.69, 5.47]
count_2020=[10.70, 8.88, 6.61]
count1=[5.48,6.04,10.70] #要将矩阵逆置,相当于先只画出每组的第一个,再画第二个
count2=[3.78,5.69,8.88]
count3=[3.25,5.47,6.61]
count_sum=[5.48, 3.78, 3.25,
6.04, 5.69, 5.47,
10.70, 8.88, 6.61]
dic_sum=['河南', '内蒙古', '河北',
'河南', '黑龙江', '吉林',
'黑龙江', '吉林', '河南']
#为了给每个柱子写上文字
dict_2020=['黑龙江', '吉林', '河南']
dict_2019=['河南', '黑龙江', '吉林']
dict_2018=['河南', '内蒙古', '河北']
x = np.arange(len(count1)) #x坐标长度
plt.figure(figsize=(9,6))
width=0.2 #左右宽度
"""
rects1 = plt.bar(x - width, count1, width,color=['grey','gold','y']) # 返回绘图区域对象
rects2 = plt.bar(x, count2, width,color=['green','r','pink'])
rects3 = plt.bar(x + width, count3, width,color=['b','c','m'])
"""
rects1 = plt.bar(x-width, count1, width) # 返回绘图区域对象,画每组数据的第一个柱子,在x整体上向左移width,数据是count1,宽度是width
rects2 = plt.bar(x, count2, width) #画每组数据的第二个柱子,处于x正中,数据是count2,宽度是width
rects3 = plt.bar(x+width, count3, width) #画每组数据的第三个柱子,在x整体上向右移width,数据是count3,宽度是width
#rects4 = plt.bar(x+width, count4, width)
#rects5 = plt.bar(x+width*2, count5, width)
"""
rects1 = plt.bar(x - width, count1, width) # 返回绘图区域对象
rects2 = plt.bar(x, count2, width)
rects3 = plt.bar(x + width, count3, width)
"""
# 设置标签标题,图例
plt.ylabel('单位:万辆')
plt.title('2018-2020地区销售情况')
plt.xticks(x,labels)
word=""
def set_label(rects):
global word
for rect in rects:
height = rect.get_height() # 获取⾼度
height=np.float(height)
word=""
for i in range(len(count_sum)):
if height == count_sum[i]: #给每个柱子命名上不同的省份
if height==6.45:
height+=1
word=word+dic_sum[i]+'\n'+str(height)
break
print(word)
plt.text(x = rect.get_x() + rect.get_width()/2, # ⽔平坐标
y = height+0.4, # 竖直坐标
s = word, # ⽂本
ha = 'center',
fontsize=10, #字体样式
fontweight='bold',
verticalalignment="center") # ⽔平居中
"""
for i in range(3):
if()
set_label(rects1,"黑龙江")
set_label(rects2,"吉林")
set_label(rects3,"吉林")
"""
set_label(rects1)
set_label(rects2)
set_label(rects3) #画出第1 2 3 组数据
#set_label(rects4)
#set_label(rects5)
plt.tight_layout() # 设置紧凑布局
plt.savefig('./分组带标签柱状图.png')
效果:
同样的,画每组5个也是同样的操作,试着调一调
二、饼状图:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
import numpy as np
#explode = (0.2,0,0,0,0.2,0,0)
label = dic_max20 #标签名
data_list = value_max20 #数值
fig = plt.figure(figsize=(10,10))
ax = fig.add_subplot() #添加一个就画了一个图,可以添加221 223等多个,同时画多个图
ax.pie(data_list, labels=label, autopct='%1.2f%%') #pie画饼状图,数值就是data_list,标签就是label,计算出的数值保留两位小数
plt.title("2018-2020年车厂销售情况")
plt.show()
没截全,凑活着看吧