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()