画图
主要只用三个模块: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()