1. 条形图
import pymysql
import matplotlib.pyplot as plt
# from matplotlib import font_manager
##获取一个数据库连接,注意如果是UTF-8类型的,需要制定数据库
db=pymysql.connect(host="127.0.0.1",user='root',passwd="123456789",port=3306,db="demo",charset='utf8')
cursor=db.cursor()#获取一个游标
sql="select city,need from citys"
cursor.execute(sql)
result=cursor.fetchall() #result为元组
cursor.close() #关闭游标
db.close() #关闭数据库
#将元组数据存进列表中
city=[]
need=[]
for x in result:
city.append(x[0])
need.append(x[1])
# 一种设置字体的方式
# my_font = font_manager.FontProperties(fname="D:\software\python\Anaconda3\Library\MyFonts\GeiTangBuDaoDan.ttf")
# 设置字体
plt.rcParams['font.sans-serif']=['LiSu']
plt.rcParams['axes.unicode_minus'] = False
# 设置图形大小
plt.figure(figsize=(12, 5), dpi=120)
# 设置刻度字体大小
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
#直方图
plt.bar(range(len(need)), need, color='r', tick_label=city)
plt.xlabel("城市名", fontsize=20)
plt.ylabel("数量", fontsize=20)
plt.title("城市职位需求图", fontsize=20)
for x,y in enumerate(need):
plt.text(x-0.4, y+0.4, '%s' % y)
plt.show()
2. 从数据库读入数据, 制作饼图
import pandas as pd
import matplotlib.pyplot as plt
##获取一个数据库连接,注意如果是UTF-8类型的,需要制定数据库
db=pymysql.connect(host="127.0.0.1",user='root',passwd="123456789",port=3306,db="demo",charset='utf8')
cursor=db.cursor()#获取一个游标
sql="select city,need from citys"
cursor.execute(sql)
result=cursor.fetchall() #result为元组
col_result = cursor.description # 获取查询结果的字段描述
cursor.close() #关闭游标
db.close() #关闭数据库
# 设置字体
plt.rcParams['font.sans-serif']=['LiSu']
plt.rcParams['axes.unicode_minus'] = False
# 设置图形大小
plt.figure(figsize=(6, 4), dpi=120)
# 用数据库查询到的数据创建DataFrame
# print(col_result)
df = pd.DataFrame(result, columns=[col_result[0][0], col_result[1][0]])
# 饼图
slices = df.iloc[:, 1]
activities = df.iloc[:, 0]
plt.pie(slices,labels=activities,
startangle=90, # 初始角度
shadow= True, # 阴影
textprops={'size': 'small'},
# colors=[], # 设置颜色
# radius=1.6, # 半径
explode=(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.05, 0), # 突出
autopct='%1.2f%%') #
plt.title('城市职位需求图')
plt.show()
3.折线图(完整)
"""折线图 (画出你和同桌在11-25岁谈过的女友数) """
import matplotlib.pyplot as plt
import numpy as np
# 设置字体
plt.rcParams['font.sans-serif'] = ['LiSu']
plt.rcParams['axes.unicode_minus'] = False
# 1.设置图片大小
# 实例化figure并传递参数 dpi为每英寸像素点数
fig = plt.figure('Figure Object 1', # 图形对象名称 窗口左上角显示
figsize=(8, 4), # 窗口大小
dpi=80, # 分辨率
facecolor = 'white', # 背景色
)
# x轴和y轴
x = range(11, 31)
y_1 = [1, 0, 1, 1, 2, 4, 3, 2, 3, 4, 4, 5, 6, 5, 4, 3, 3, 1, 1, 1]
y_2 = [1, 0, 3, 1, 2, 2, 3, 3, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1]
plt.plot(
x,
y_1,
# 折线样式
color='r', # 设置线条颜色
linestyle='--', # 线条风格
linewidth=1, # 线条粗细
alpha=0.5, # 透明度
label='自己',
# 6.折点样式设置
marker='o', # 折点形状
markersize='3', # 或 ms --折点大小
markerfacecolor='black', # 或 mfc --折点实心颜色
)
plt.plot(
x,
y_2,
color='b', # 设置线条颜色
linestyle=':', # 线条风格
linewidth=1, # 线条粗细
alpha=0.5, # 透明度
label='同桌',
# 折点样式设置
marker='*', # 折点形状
markersize='6', # 或 ms --折点大小
markerfacecolor='pink', # 或 mfc --折点实心颜色
)
# 8.标出最高点 (因为横纵坐标没有必然联系所以比较难整)
zip1 = dict( zip(x, y_1) ) # 把横纵坐标合为一个字典
# 找出最大值和下标
for key,value in zip1.items():
if(value == max(zip1.values())):
max_index1 = key
max_value1 = value
del zip1
plt.plot(max_index1,max_value1,'ks')
s = f"({max_index1},{max_value1})"
# plt.annotate()函数用于标注文字
plt.annotate(s, xytext=(max_index1,max_value1), xy=(max_index1,max_value1)) # 注释内容 注释文本的坐标点 被注释的坐标点,二维元组形如(x,y)
####
zip2 = dict( zip(x, y_2) ) # 把横纵坐标合为一个字典
# 找出最大值和下标
for key,value in zip2.items():
if(value == max(zip2.values())):
max_index2 = key
max_value2 = value
del zip2
plt.plot(max_index2,max_value2,'ks')
s = f"({max_index2},{max_value2})"
# plt.annotate()函数用于标注文字
plt.annotate(s, xytext=(max_index2,max_value2), xy=(max_index2,max_value2))
# 4.调整x和y轴刻度间距
_xtick_labels = ["{}岁".format(i) for i in x]
plt.xticks(x, _xtick_labels, rotation=45, fontsize=9)
plt.yticks(range(0, 9))
# 5.线条样式 颜色 透明度
# 加网格 (透明度)
plt.grid(alpha=0.5, linestyle='--', linewidth=1)
# 3.描述信息(x轴[y轴.标题]代表什么)
plt.xlabel('年龄')
plt.ylabel('人数')
plt.title("回忆青葱岁月", fontsize=16)
plt.legend(loc='best')
# 2.保存到本地 (可设置格式(svg矢量图))
# plt.savefig("data/xxx.svg")
# 7.图片加水印
def add_watermark(x, y):
fig.text(x, y, '寒川环宇', # text的位置,内容
fontsize=16,
color='gray',
ha='left',
va='top',
rotation=-45, #旋转角度
alpha=0.3,
bbox = dict(facecolor = "#B0C4DE", alpha = 0.05)) # 加框(框体颜色,透明度)
add_watermark(0.5, 0.6)
add_watermark(0.5, 0.8)
add_watermark(0.2, 0.6)
add_watermark(0.2, 0.8)
plt.show()
结果
4.条形图
"""条形图 bar()"""
import pandas as pd
import matplotlib.pyplot as plt
# 示例
# plt.bar(np.arange(2,5),np.arange(1,4),
# label="zt example")
# plt.bar([1,2,3],[2,4,1],label="tz example", color='g')
# plt.xlabel("this is x")
# plt.ylabel("this is y")
# plt.title("this is bar")
# plt.legend()
# plt.show()
"""展示2017票房数据"""
# 设置字体
plt.rcParams['font.sans-serif'] = ['LiSu']
plt.rcParams['axes.unicode_minus'] = False
# 1.设置图片大小
# 实例化figure并传递参数 dpi为每英寸像素点数
fig = plt.figure(figsize=(8, 4), dpi=200)
movie_name = ["战狼2","速度与激情8","功夫瑜伽","西游伏妖篇","变形金刚5:最后的骑士","摔跤吧!爸爸","加勒比海盗5:死无对证","金刚:骷髅岛","极限特工:终极回归","生化危机6:终章","乘风破浪","神偷奶爸3","智取威虎山","大闹天竺","金刚狼3:殊死一战","蜘蛛侠:英雄归来","悟空传","银河护卫队2","情圣","新木乃伊",]
box_office = [56.01,26.94,17.53,16.49,15.45,12.96,11.8,11.61,11.28,11.12,10.49,10.3,8.75,7.55,7.32,6.99,6.88,6.86,6.58,6.23]
df = pd.DataFrame( {"电影名":movie_name, "票房(单位:亿)":box_office} )
# df
x = range(df.shape[0]) # x轴的列表
y = box_office
# bar()绘制条形图,只能接受可迭代的数字对象
plt.bar(x, y,
width = 0.4, # 默认0.8
color = 'orange',
tick_label = y,
label = '电影', # 为设置图例作准备
alpha = 0.9
)
# 通过设置xticks使数字与字符串对应
plt.xticks(x, df.iloc[:, 0], rotation=90)
# 设置描述信息
plt.title("2017年电影票房展示")
plt.xlabel(df.columns[0])
plt.ylabel(df.columns[1])
# 显示图例
plt.legend()
plt.show()
5.水平条形图 barh()
"""水平条形图 barh()"""
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
"""展示2017票房数据"""
movie_name = ["战狼2","速度与激情8","功夫瑜伽","西游伏妖篇","变形金刚5:最后的骑士","摔跤吧!爸爸","加勒比海盗5:死无对证","金刚:骷髅岛","极限特工:终极回归","生化危机6:终章","乘风破浪","神偷奶爸3","智取威虎山","大闹天竺","金刚狼3:殊死一战","蜘蛛侠:英雄归来","悟空传","银河护卫队2","情圣","新木乃伊",]
box_office = [56.01,26.94,17.53,16.49,15.45,12.96,11.8,11.61,11.28,11.12,10.49,10.3,8.75,7.55,7.32,6.99,6.88,6.86,6.58,6.23]
df = pd.DataFrame( {"电影名":movie_name, "票房(单位:亿)":box_office} )
# df
# 设置字体
plt.rcParams['font.sans-serif'] = ['LiSu']
plt.rcParams['axes.unicode_minus'] = False
# 1.设置图片大小
# 实例化figure并传递参数 dpi为每英寸像素点数
fig, ax = plt.subplots(figsize=(20, 16), dpi=80)
x = np.arange(df.shape[0]) # x轴的列表
y = box_office
# bar()绘制条形图,只能接受可迭代的数字对象
plt.barh(x, y,
height = 0.4,
color = 'orange',
label = '电影', # 为设置图例作准备
alpha = 0.9,
align='center'
)
# plt.yticks(y, movie_name) # , rotation=90
ax.set_yticks(x)
ax.set_yticklabels(df.iloc[:, 0], minor=False, fontsize=16)
ax.invert_yaxis() # 标签读取自上而下labels read top-to-bottom
# 设置描述信息
ax.set_title("2017年电影票房展示", fontsize=20)
ax.set_xlabel(df.columns[1], fontsize=20)
ax.set_ylabel(df.columns[0], fontsize=20)
# 显示图例
ax.legend()
plt.show()
人生之事岂能尽如人意,生活如戏,哭笑皆由人,悲喜自己定