Python画图

需要导入的包

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)的数组,该数组指定要偏移每个楔形的半径分数
labelslist,为每个楔形提供标签
colorslist,设定每个楔形的颜色
autopctNone or str or callable,控制饼图内的百分比设置,可以使用格式化字符串,如“%3.1f%%” 指小数点前有3位,后有1位,并且数字带%
pctdistance每个饼图切片的中心与autopct生成的文本的开头之间的比率。如果autopct=None,则忽略这个参数
shadowbool类型,表示是否在馅饼下面画一个影子
labeldistance绘制饼图标签的径向距离。如果设置为“None”,则不绘制标签,而是存储在图例legend()中以供使用
startanglefloat,饼图开始的角度,从x轴逆时针开始
rotatelabelsbool,如果为True,则将每个标签旋转到相应切片的角度
radiusfloat,饼图的半径
counterclockbool,指定分数方向,顺时针(False)或逆时针(True)
wedgepropsdict,传递给制作饼图的楔形对象的参数的dict。例如,wedgeprops = {‘linewidth’: 3}即表明楔形边界线宽为3
textpropsdict,传递给文本对象的参数的dict
center(float, float), 默认: (0, 0),图表中心的坐标
framebool,是否给图表绘制坐标轴框架,True则绘制
normalizeNone or bool。为True时,则始终通过标准化x使sum(x)== 1来生成完整饼图;如果sum(x)<=1,则为False生成部分饼图,并为sum(x)>1引发ValueError。
为None时,如果sum(x)>=1,则默认为True;如果sum(x)<1,则默认为False。
返回值含义
patcheslist,一系列matplotlib.patches.Wedge实例
textslist,标签文本列表的实例
autotextslist,数字标签的文本实例列表。仅当参数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,vmaxfloat,图例中最大值和最小值的显示值,没有该参数时,图例中的最大最小值则是从数据和其他关键字参数推断出来的
cmapheatmap的颜色,具体可选颜色类型见后文
centerfloat,绘制有色数据时,颜色靠近colormap中间的值。如果未指定任何cmap,则使用此参数将更改默认cmap
robustbool,如果是True,并且vmin或vmax为空,则使用稳健分位数而不是极值来计算色彩映射范围
annotbool or rectangular dataset。
如果为True,则在每个热力图单元格中写入数据值;
如果数组的形状与data相同,则使用它来代替原始数据注释热力图
fmtstr,添加注释时要使用的字符串格式代码
annot_kwsdict,当annot为True时,可通过该参数来设置各个文本对象的参数,包括大小,颜色等
linewidthsfloat,划分每个单元格的行的宽度
linecolorcolor,划分每个单元的线条的颜色
cbarbool,如果是True,则绘制colorbar
cbar_kwsdict,matplotlib.figure.figure.colorbar() 的关键字参数
cbar_ax用于绘制颜色条的轴,否则从主轴获取
squarebool,如果为True,则将坐标轴方向设置为“equal”,以使每个单元格为方形
xticklabels,yticklabelsauto”, bool, list-like, or int。如果为True,则绘制数据框的列名称。如果为False,则不绘制列名称。如果是list,则将这些替代标签绘制为xticklabels。如果是int,则使用列名称,但仅绘制每个n标签。如果是“auto”,将尝试密集绘制不重叠的标签。
maskbool 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

  • 8
    点赞
  • 151
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值