画图


主要只用三个模块:matplotlib、seaborn、plotly

matplotlib 构建柱状图

柱状图内容显示中文

plt.rcParams['font.sans-serif'] = ['SimHei']  # 内容显示中文

图片提升像素

plt.rcParams['savefig.dpi'] = 300  # 图片像素
plt.rcParams['figure.dpi'] = 300  # 分辨率

向图片中添加值

for x, y in enumerate(y_list):
 plt.text(x, y + 0.05, '%.0f' % y, ha='center', va='bottom', fontsize=11)
# y_list为要显示值的内容
# plt.text第一个参数为横向的方位
# plt.text第二个参数为竖向的方位
# plt.text第三个参数为显示的内容
# ha参数有:cente、right、left
# va是显示在标注点的上方还是下方
# fontsize为字体的大小

输出图片

plt.savefig('./投诉举报登记趋势.png', format='png')
# 第一个参数为地址
# format为图片格式
# 输出的图片不太理想,若合适可以直接复制

控制图片大小

plt.figure(figsize=(10, 15))
# 第一个参数为宽度
# 第二个参数为高度
import seaborn
import matplotlib.pyplot as plt


# 柱状图标题
plt.title("标题内容")
# X轴名称
plt.xlabel("X轴名称")
# Y轴名称
plt.ylabel("Y轴名称")
# X轴设置
plt.xticks([1, 2, 3, 4], ['北京', '上海', '深圳', '杭州'])
# 设置X轴和Y轴的区间
plt.axis([0, 5, 0, 200])

# 第一个参数为X轴内容,第二个参数为Y内容
# width,柱状图的宽度
plt.bar([1, 2, 3, 4], [55, 77, 66, 99], width=0.5)
# 只用zip函数遍历 X轴 和 Y轴 的内容
for x,y in zip([1, 2, 3, 4], [55, 77, 66, 99]):
    # 使用text(标注函数)将 Y轴 内容标注在柱状图上
    # 第一个参数为 X轴位置, 第二个参数为 Y轴 位置, 第三个参数为 需要标注的内容
    # ha 参数为在柱状图的那个方位,居中(center)
    # va 内容在柱状图的上方还是下方 上方(bottom)
    plt.text(x, y, y, ha='left', va='bottom')
plt.show()

seaborn 构建柱状图

使用seaborn过程中有问题请上官网查看API文档:seaborn: statistical data visualization — seaborn 0.12.0 documentation

import pandas as pd
data = pd.DataFrame([['first', 55, 'one'], ['two', 77, 'one'],
                     ['three', 66, 'two'], ['four', 99, 'two']],
                    columns=['salary', 'count', 'fen'])

print(data)
import seaborn as sns
import matplotlib.pyplot as plt


# 柱状图背景,可选参数:darkgrid, whitegrid, dark, white, ticks
sns.set_style("darkgrid")
# context:表格字体,可选参数:paper, notebook, talk, poster
# font_scale字号,为原来的多少 倍
sns.set_context(context="poster", font_scale=1.5)
# 柱状图颜色,可选参数:从matplotlib colormap API 官方文档中查看颜色的名词
sns.set_palette("Reds")
# 柱状图颜色:
sns.set_palette(sns.set_palette("RdBu", n_colors=7))

# x 确定 X 轴坐标内容
# y 确定 Y 轴坐标内容
# hue 确定 通过内容进行再分类
# data Dateframe 数据类型的数据
sns.barplot(x="salary", y="count", hue="fen", data=data)
plt.show()

seaborn 构建直方图

import pandas as pd
data = pd.DataFrame([[55], [77],
                     [66], [99]],
                    columns=['salary'])

print(data)

import seaborn as sns
import matplotlib.pyplot as plt


f = plt.figure()
# 新建一个子图,可以创建多个子图
# 参数内容为:
# 第一个参数:行;创建几行直方图
# 第二个参数:列;创建几列直方图
# 第三个参数:在指定行的第几列
f.add_subplot(1, 3, 1)
# 第一个参数为data内容
# bin:分为 10 份
# hist:曲线图是否存在
# ked:柱状图是否存在
sns.distplot(data, bins=10, hist=True, kde=True)
plt.show()

seaborn 构建箱线图

可以非常直观的表现出异常值和正常值之间的区间范围

import pandas as pd
data = pd.DataFrame([[55], [77],
                     [66], [99]],
                    columns=['salary'])

print(data)

import seaborn as sns
import matplotlib.pyplot as plt


# 可以是x等于data内容,也可以是y等于data内容
# x竖着的,y的效果为横着的
# saturation:圈定了方框的边界
# whis:上分位数再上多少为边界
sns.boxplot(x=data.values, saturation=0.75, whis=3)
plt.show()

seaborn 构建折线图

可以非常直观的表现出异常值和正常值之间的区间范围

import pandas as pd
data = pd.DataFrame([['first', 55], ['two', 77],
                     ['three', 66], ['four', 99]],
                    columns=['salary', 'count'])

print(data)

import seaborn as sns
import matplotlib.pyplot as plt


'''
两种实现方法

第一种:
x:指定 X 轴的数据
y:指定 Y 轴的数据
data:来源数据

第二种:
第一个参数为:X 轴内容
第二个参数为:Y 轴内容
'''
sns.pointplot(x='salary', y='count', data=data)
# sns.pointplot(data.index, data['salary'])
plt.show()

matplotlib 构建饼图

主要做来结构分析

import pandas as pd
data = pd.DataFrame([[55], [77],
                     [66], [99]],
                    columns=['salary'])

print(data)

import matplotlib.pyplot as plt
import seaborn as sns

index_list = data.value_counts().index
explode_list = [0.1 if i == (77,) else 0 for i in index_list]
'''
第一个参数为Dateframe数据类型
labels:饼图外面显示的名称
autopct:饼图中显示的百分比
colors:饼图显示的颜色
explode:想要重点突出一块的间距
'''
plt.pie(
    data.value_counts(normalize=True),
    labels=index_list,
    autopct='%1.1f%%',
    colors=sns.color_palette("Reds"),
    explode=explode_list
)
plt.show()

seaborn

matplotlib的封装,有不同的主体风格

sns.set_style('dark')
# 有五种风格
# darkgrid:深色背景,带格子
# whitegrid:白色背景,带格子
# dark:深色背景,不带格子
# white:白色背景,不带格子
# ticks:在X轴和Y轴和上方,还有右边,上对应的节点有突出,若想去掉上方和右边可以使用
sns.despine()

颜色

主要函数:sns.color_palette()

sns.color_palette()默认六中颜色

sns.color_palette()扩充颜色:

sns.palplot(sns.color_palette("hls", 8))  # hls是一个颜色库,后面的数字是要分成的几种颜色
# 颜色的使
sns.boxplot(data=data, palette=sns.color_palette("hls", 8))
# 亮度和饱和度
sns.palplot(sns.hls_palette(8, l=.5, s=.9))  # l是亮度,s是饱和度

连续性的画板

sns.palplot(sns.color_palette("Blues"))  # 渐变色由浅到深
sns.palplot(sns.color_palette("Blues"))  # 由深到浅

 横向条形

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np


# 读取excel表格
data = pd.read_excel(r'./计量数据情况.xlsx', sheet_name='涉及企业-行政区划')

# 读取X轴和Y轴数据
x = list(data['Unnamed: 1'][0:10])
y = list(data['Unnamed: 2'][0:10])
data = []
for i in range(len(x)):
    data.append([x[i], int(y[i])])


data = pd.DataFrame(data, columns=['涉及企业-行政区划', '数量'])

# 柱状图背景,可选参数:darkgrid, whitegrid, dark, white, ticks
sns.set_style("darkgrid")

# 显示汉字
rc = {'font.sans-serif': 'SimHei',
      'axes.unicode_minus': False}
sns.set(context='notebook', style='ticks', rc=rc)

# context:表格字体,可选参数:paper, notebook, talk, poster
# font_scale字号,为原来的多少 倍
sns.set_context(context="poster", font_scale=1)

# 柱状图颜色,可选参数:从matplotlib colormap API 官方文档中查看颜色的名词
sns.set_palette("Reds")
# 柱状图颜色:
sns.set_palette(sns.set_palette("RdBu", n_colors=7))

# x 确定 X 轴坐标内容
# y 确定 Y 轴坐标内容
# hue 确定 通过内容进行再分类
# data Dateframe 数据类型的数据
bar2 = sns.barplot(x="数量", y="涉及企业-行政区划", data=data)
# plt.bar_label(bar2.containers[0])

# X轴刻度显示具体值
bar2.get_xaxis().get_major_formatter().set_scientific(False)

# 在条形图上写值
# show_values_on_bars说明:
# axs:是图的对象
# h_v:输入h为竖起来的条形图,b是横向的条形图
# space:条形图的间隔
def show_values_on_bars(axs, h_v="v", space=0.4):
    def _show_on_single_plot(ax):
        if h_v =="v":
            for p in ax.patches:
                _x = p.get_x() + p.get_width() / 2
                _y = p.get_y() + p.get_height()
                value = int(p.get_height())
                ax.text(_x, _y, value, ha="center")
        elif h_v =="h":
            for p in ax.patches:
                _x = p.get_x() + p.get_width() + float(space)
                _y = p.get_y() + p.get_height()
                value = int(p.get_width())
                ax.text(_x, _y, value, ha="center")

    if isinstance(axs, np.ndarray):
        for idx, ax in np.ndenumerate(axs):
            _show_on_single_plot(ax)
    else:
        _show_on_single_plot(axs)


show_values_on_bars(bar2, "h", 0.3)

plt.show()