文章目录
需要导入的包
Python中画图通常使用matplotlib来画折线图、柱状图、散点图等,习惯用seaborn来画热力图。用numpy或者pandas来处理数据。
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import pandas as pd
plt.plot()——折线图
x = np.linspace(0, 10, 10)
y = 3*x - 4
# 新建画布,通过figsize来控制画布大小,(10, 6)对应图片分辨率为1000x600
# 这句话也可以不加,plt会根据数据自适应生成画布
plt.figure(figsize=(7, 5))
# 利用plt.plot函数来画折线图
plt.plot(x, y,
color='r', # 线的颜色
linestyle='-', # 线的类型
linewidth=2, # 线的宽度
marker='o', # 标记点的形状
markeredgecolor='b', # 标记点边缘的颜色
markerfacecolor='b', # 标记点内部的颜色
markersize=5, # 标记点的大小
alpha=0.5, # 设置透明度
)
plt.xlabel('x') # 设置x的标签
plt.ylabel('y') # 设置y的标签
plt.title('title') # 设置题目
plt.savefig('fig.jpg') # 保存图片,可以通过更改后缀来改变图片保存格式jpd、png、pdf等
plt.show() # 展示图片
效果图:
linestyle:
符号 | 含义 |
---|---|
‘-’ | 实线 |
‘- -’ | 虚线 |
‘-.’ | 点划线 |
‘:’ | 一串点 |
‘’ ‘’ | 没有线条 |
常用的marker:
符号 | 含义 |
---|---|
‘.’ | 点标记 |
‘o’ | 实心圈标记 |
‘x’ | 叉叉标记 |
‘v’ | 倒三角标记 |
‘^’ | 上三角标记 |
‘>’ | 右三角标记 |
‘<’ | 左三角标记 |
‘s’ | 实心方形标记 |
‘p’ | 实心五角标记 |
‘*’ | 星形标记 |
‘+’ | 十字标记 |
‘D’ | 菱形标记 |
‘d’ | 瘦菱形标记 |
plt.scatter()——散点图
P_x1 = [1, 1, 2, 3]
P_x2 = [2, 3, 3, 3]
N_x1 = [0, 1, 2, 3]
N_x2 = [1, 1, 1, 2]
plt.figure()
plt.scatter(P_x1, P_x2, c='r', alpha=0.5, marker='o')
plt.scatter(N_x1, N_x2, c='b', alpha=0.5, marker='x')
# 图例
plt.legend(labels=['positive', 'negative'], # 图例中标签的顺序与画图的顺序一致
loc='upper left', # 图例的位置参数
fontsize=12, # 图例中字体的大小设置
)
plt.xlabel('$x_1$')
plt.ylabel('$x_2$')
plt.title('title')
plt.show()
效果图:
legend中的loc参数:
字符串 | 数字 | 含义 |
---|---|---|
‘best’ | 0 | 系统自动选择最佳位置 |
‘upper right’ | 1 | 右上角 |
‘upper left’ | 2 | 左上角 |
‘lower left’ | 3 | 左下角 |
‘lower right’ | 4 | 右下角 |
‘right’ | 5 | 右侧 |
‘center left’ | 6 | 中偏左 |
‘center right’ | 7 | 中偏右 |
‘lower center’ | 8 | 中下 |
‘upper center’ | 9 | 中上 |
‘center’ | 10 | 正中间 |
plt.bar()——柱状图
r_2, rmse, mae, mape = data_extract() # 数据
x = np.arange(6)
bar_width = 0.2 # 设置每一个条形的宽度
# 设置x轴上每一个刻度的名称
tick_label = ['data1', 'data2', 'data3',
'data4', 'data5', 'data6']
plt.bar(x, r_2,
bar_width,
color="yellow", # 颜色
align="center", # 条形的位置
label="$R^2$", # 条形的标签,便于使用图例
alpha=1, # 设置条形中颜色的透明度
edgecolor='black',# 条形边框的颜色
)
plt.bar(x + bar_width, rmse, bar_width, color="b", align="center", label="RMSE", alpha=0.5, edgecolor='black')
plt.bar(x + bar_width * 2, mae, bar_width, color="r", align="center", label="MAE", alpha=0.5, edgecolor='black')
plt.bar(x + bar_width * 3, mape, bar_width, color="lightgreen", align="center", label="MAPE", alpha=0.8, edgecolor='black')
# 单独用字典来设置字体的类型、宽度和大小
font = {'family': 'Times New Roman',
'weight': 'normal',
'size': 15,
}
plt.xlabel('Data', font)
plt.ylabel('Values', font)
plt.title('Metric')
plt.xticks(x + bar_width / 2, tick_label) # 设置x轴上标签的位置
plt.legend()
# 在图中添加网格
plt.grid(b=True, # True表示显示网格线,False表示不显示
ls='--', # 设置网格线的线型,和之前的线型通用
alpha=0.5, # 设置网格线的透明度
)
plt.show()
效果图:
plt.pie()——饼图
plt.pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=0, radius=1, counterclock=True, wedgeprops=None, textprops=None, center=0, 0, frame=False, rotatelabels=False, *, normalize=None, data=None)
参数 | 含义 |
---|---|
x | 一维数组,用来表示每一块的比例 |
explode | 默认值是None,如果不是None,则应该是一个len(x)的数组,该数组指定要偏移每个楔形的半径分数 |
labels | list,为每个楔形提供标签 |
colors | list,设定每个楔形的颜色 |
autopct | None or str or callable,控制饼图内的百分比设置,可以使用格式化字符串,如“%3.1f%%” 指小数点前有3位,后有1位,并且数字带% |
pctdistance | 每个饼图切片的中心与autopct生成的文本的开头之间的比率。如果autopct=None,则忽略这个参数 |
shadow | bool类型,表示是否在馅饼下面画一个影子 |
labeldistance | 绘制饼图标签的径向距离。如果设置为“None”,则不绘制标签,而是存储在图例legend()中以供使用 |
startangle | float,饼图开始的角度,从x轴逆时针开始 |
rotatelabels | bool,如果为True,则将每个标签旋转到相应切片的角度 |
radius | float,饼图的半径 |
counterclock | bool,指定分数方向,顺时针(False)或逆时针(True) |
wedgeprops | dict,传递给制作饼图的楔形对象的参数的dict。例如,wedgeprops = {‘linewidth’: 3}即表明楔形边界线宽为3 |
textprops | dict,传递给文本对象的参数的dict |
center | (float, float), 默认: (0, 0),图表中心的坐标 |
frame | bool,是否给图表绘制坐标轴框架,True则绘制 |
normalize | None or bool。为True时,则始终通过标准化x使sum(x)== 1来生成完整饼图;如果sum(x)<=1,则为False生成部分饼图,并为sum(x)>1引发ValueError。 为None时,如果sum(x)>=1,则默认为True;如果sum(x)<1,则默认为False。 |
返回值 | 含义 |
---|---|
patches | list,一系列matplotlib.patches.Wedge实例 |
texts | list,标签文本列表的实例 |
autotexts | list,数字标签的文本实例列表。仅当参数autopct不是None时才会返回 |
代码如下:
train_data = pd.read_csv("churn-bigml-80.csv")
labels = train_data["Churn"].value_counts().keys().tolist()
values = train_data["Churn"].value_counts().values.tolist()
fig = plt.figure(figsize=(12, 8),
facecolor='white', # 设置画布的背景颜色
)
plt.pie(x=values,
autopct='%3.1f%%', # 控制饼图内的百分比设置
colors=['skyblue', 'yellow'], # 不同类别的颜色设置
labels=labels, # 设置类别标签
# 饼图中的字体设置
textprops=dict(color='k', # 字体颜色
fontsize=18, # 字体大小
family='Arial', # 字体类型
)
)
plt.title(label="Customer churn in training data", # 图片标题
size=25, # 标题中字体大小
color='black', # 标题颜色
weight='bold') # bold表示加粗
plt.legend(loc="upper right",
labels=labels,
facecolor=fig.get_facecolor(), # 图例的背景颜色,这里表示和画布的背景颜色一致
edgecolor='darkgray', # 图例的边框颜色
fontsize=15, # 图例中字体的大小
)
plt.show()
效果图如下:
因为在pie()函数中设置了参数labels,所以在饼图两侧会出现标签名称,即图中被用红框圈出的,但是因为通常会加图例,所以可以不用设置pie()函数中的labels参数。
plt.pie()——圆环
圆环,即在原饼图的中间画一个和背景颜色一样的同心饼图即可,代码如下:
train_data = pd.read_csv("churn-bigml-80.csv")
labels = train_data["Churn"].value_counts().keys().tolist()
values = train_data["Churn"].value_counts().values.tolist()
fig = plt.figure(figsize=(12, 8),
facecolor='white')
plt.pie(x=values,
autopct='%3.1f%%',
radius=1,
pctdistance=0.8,
startangle=20,
counterclock=False,
colors=['skyblue', 'yellow'],
wedgeprops={'edgecolor': 'white',
'linewidth': 1,
'linestyle': '-',
},
frame=True,
textprops=dict(color='k',
fontsize=18,
family='Arial',
)
)
plt.pie(x=[1], radius=0.6, colors=[fig.get_facecolor()])
plt.title(label="Customer churn in training data",
size=25,
color='black',
weight='bold')
plt.legend(loc="upper right",
labels=labels,
facecolor=fig.get_facecolor(),
edgecolor='darkgray',
fontsize=15,
)
plt.show()
效果图:
seaborn.heatmap()——热力图
seaborn.heatmap(data, vmin=None, vmax=None, cmap=None, center=None, robust=False, annot=None, fmt=’.2g’, annot_kws=None, linewidths=0, linecolor=‘white’, cbar=True, cbar_kws=None, cbar_ax=None, square=False, xticklabels=‘auto’, yticklabels=‘auto’, mask=None, ax=None, **kwargs)
参数 | 含义 |
---|---|
data | 矩形数据集,可以强制转换为ndarray格式数据的2维数据集。如果提供了Pandas DataFrame数据,则索引和列信息将分别对应于columns和rows信息 |
vmin,vmax | float,图例中最大值和最小值的显示值,没有该参数时,图例中的最大最小值则是从数据和其他关键字参数推断出来的 |
cmap | heatmap的颜色,具体可选颜色类型见后文 |
center | float,绘制有色数据时,颜色靠近colormap中间的值。如果未指定任何cmap,则使用此参数将更改默认cmap |
robust | bool,如果是True,并且vmin或vmax为空,则使用稳健分位数而不是极值来计算色彩映射范围 |
annot | bool or rectangular dataset。 如果为True,则在每个热力图单元格中写入数据值; 如果数组的形状与data相同,则使用它来代替原始数据注释热力图 |
fmt | str,添加注释时要使用的字符串格式代码 |
annot_kws | dict,当annot为True时,可通过该参数来设置各个文本对象的参数,包括大小,颜色等 |
linewidths | float,划分每个单元格的行的宽度 |
linecolor | color,划分每个单元的线条的颜色 |
cbar | bool,如果是True,则绘制colorbar |
cbar_kws | dict,matplotlib.figure.figure.colorbar() 的关键字参数 |
cbar_ax | 用于绘制颜色条的轴,否则从主轴获取 |
square | bool,如果为True,则将坐标轴方向设置为“equal”,以使每个单元格为方形 |
xticklabels,yticklabels | auto”, bool, list-like, or int。如果为True,则绘制数据框的列名称。如果为False,则不绘制列名称。如果是list,则将这些替代标签绘制为xticklabels。如果是int,则使用列名称,但仅绘制每个n标签。如果是“auto”,将尝试密集绘制不重叠的标签。 |
mask | bool array or DataFrame。遮罩。如果为空值,数据将不会显示在mask为True的单元格中。 具有缺失值的单元格将自动被屏蔽 |
ax | 绘制图的坐标轴,否则使用当前活动的坐标轴 |
返回值 | 含义 |
---|---|
ax | 热力图的轴对象 |
代码如下:
data = np.random.rand(4, 3)
x_label = ['1', '2', '3']
y_label = ['1', '2', '3', '4']
plt.figure()
sns.heatmap(data=data,
cmap='YlGnBu', # 颜色
annot=True, # 是否显示每个单元格的数据
annot_kws={"size": 9}, # 每个单元格数据的字体设置
xticklabels=x_label, # x轴标签
yticklabels=y_label) # y轴标签
plt.title('Example', fontsize=15)
plt.tight_layout()
plt.show()
效果图:
如果想要y轴的顺序颠倒一下,则在heatmap后添加一个.invert_yaxis(),即
sns.heatmap(data=data,
cmap='YlGnBu',
annot=True,
annot_kws={"size": 9},
xticklabels=x_label,
yticklabels=y_label).invert_yaxis()
效果图:
seaborn.pairplot()——变量相关性
通过seaborn.pairplot()函数来分析变量的分布以及变量两两之间的关系,线性、非线性、相关等。
# 加载数据,数据同上画圆环中的数据
out_cols = list(set(train_data.nunique()[train_data.nunique()<6].keys().tolist()
+ train_data.select_dtypes(include='object').columns.tolist()))
viz_cols = [x for x in train_data.columns if x not in out_cols] + ['Churn']
sns.pairplot(train_data[viz_cols], diag_kind="kde")
# plt.savefig('fig.jpg')
plt.show()
效果如图所示:
图中对角线上即为变量的分布,其他位置的图片即为变量两两之间的关系。
参考链接——客户流失率预测:https://www.kaggle.com/mnassrib/customer-churn-prediction-telecom-churn-dataset#2.-Exploratory-Data-Analysis
matplotlib常用的颜色
参考链接:https://stackoverflow.com/questions/22408237/named-colors-in-matplotlib
seaborn.heatmap中的camp
参考链接:https://bluebird.blog.csdn.net/article/details/102474190
matplotlib官网教程:http://www.matplotlib.org.cn/tutorials/#%E5%BA%8F%E8%A8%80
seaborn官网文档:http://seaborn.pydata.org/generated/seaborn.heatmap.html
Seaborn 0.9中文文档:https://www.cntofu.com/book/172/docs/30.md