数据分析(8)--matplotlib 数据可视化

数据可视化

基本概念

数据可视化是指借助于图形化的手段,清晰、快捷有效的传达与沟通信息。同时,也可以辅助用户做出相应的判断,更好的去洞悉数据背后的价值。

字不如表,表不如图。

观察号码的频率,每个号码出现了多少次?

文字

08 10 15 20 30 31 33 06
01 09 10 17 21 28 32 13
02 05 08 13 19 21 28 10
03 05 07 14 18 23 25 07
…… ……

表格

在这里插入图片描述

图形

通过可视化图表方式,就可以清晰的表达信息。
在这里插入图片描述

可视化图形辅助决策

1854 年英国伦敦霍乱病流行时,斯诺博士在绘有霍乱流行地区所有道路、房屋、饮用水机井等内容的城区地图上,标出了每个霍乱病死者的住家位置,得到了霍乱病死者居住位置分布图,发现了霍乱病源之所在:布劳德大街(现布劳维克大街)的公用抽水机。
在这里插入图片描述

matplotlib

matplotlib是用于Python的绘图库,提供各种常用图形的绘制。例如,条形图,柱形图,线图,散点图等。

安装

pip install matplotlib

导入

根据惯例,使用如下的方式导入:

import matplotlib as mpl
import matplotlib.pyplot as plt

图形绘制

绘制线图

可以通过matplotlib.pyplot的plot方法进行图形绘制。

  • plot(y)
  • plot(y, ‘格式’)
  • plot(x, y)
  • plot(x, y, ‘格式’)
  • plot(x1, y1, ‘格式1’, x2, y2, ‘格式2’ …… xn, yn, 格式n)
# 如果没有指定横坐标x,则横坐标x会从0开始,自增。(0,1,2,3,4……)
# 如果我们只绘制一个值,该值就是一个点,我们需要指定marker来设置标记,否则该点不可见。
# plt.plot(10, marker="o")
# 绘制多个点。
# plt.plot([1, 5, 8, 4, 6], marker=">")
# 显式指定横坐标。
# plt.plot([1, 3, 5, 7, 9], [2, 4, 16, 8, 10], marker="o")
# plt.plot([2, 13, 25, 7, 9], [3, 14, 6, 28, 9], marker="o")
# 可以一次性绘制多个图形。
# 格式字符串可以指定标记形状,颜色与线型。
plt.plot([1, 3], [2, 4], "r-o", [5, 8], [10, 2], "g--x")

在这里插入图片描述

图形交互式设置

我们可以设置jupyter notebook图形是否交互式显示,默认为否。

  • %matplotlib notebook
  • %matplotlib inline

%matplotlib notebook

%matplotlib inline
plt.plot([1, 2, 3], [5, 8, 11])
在这里插入图片描述

设置中文支持

matplotlib默认情况下不支持中文显示,如果需要显示中文,则我们需要做一些额外的设置操作。设置可以分为:

  • 全局设置
  • 局部设置

全局设置

我们可以通过执行:

mpl.rcParams["font.family"] = "中文字体名称"
mpl.rcParams["axes.unicode_minus"]=False

进行设置。常用的设置如下:

  • font.family 字体的名称
  • sans-serif 西文字体(默认)
  • SimHei 中文黑体
  • FangSong 中文仿宋
  • YouYuan 中文幼圆
  • STSong 华文宋体
  • Kaiti 中文楷体
  • LiSu 中文隶书
  • font.style 字体的风格
  • normal 常规(默认)
  • italic 斜体
  • oblique 倾斜
  • font.size 字体的大小(默认10)
  • axes.unicode_minus 是否使用Unicode的减号(负号)【在支持中文显示状态下,需要设置为False】

局部设置

在需要显式的文字中,使用fontproperties参数进行设置。

说明:

  • 如果全局设置与局部设置冲突,以局部设置为准。
# 默认情况下,matplotlib使用的是西方字体(不支持中文的),
# 如果需要显式中文,可以将字体设置成支持中文的字体。
mpl.rcParams["font.family"] = "Kaiti"
# mpl.rcParams["font.family"] = "sans-serif"
plt.plot([1, -2, 3], [5, -10, 6])
plt.title("中文标题")
# plt.title("abcde")
# 当字体设置成支持中文的字体时,负号也会也会使用Unicode字符集的负号(不支持显式)。
# 我们需要恢复成ASCII字符集中的负号。
mpl.rcParams["axes.unicode_minus"]=False
# 设置字体形状.(对中文的字体支持的不太好)
mpl.rcParams["font.style"] = "italic"
# 设置字体的大小。
# mpl.rcParams["font.size"] = 10

在这里插入图片描述

局部设置。

plt.plot([1, 2, 3], [4, 5, 8])
plt.title(“标题信息”, fontsize=20, fontproperties=“LiSu”)
在这里插入图片描述

保存图表

通过plt的savefig方法将当前的图形保存到硬盘或者类文件对象中。

  • dpi:每英寸分辨率点数。
  • facecolor:设置图像的背景色。
  • bbox_inches:设置为tight,可以紧凑保存图像。
x = np.linspace(0, 2 * np.pi, num=100)
y = np.sin(x)
plt.plot(x, y)
# plt.savefig("c:/1.png", dpi=50, facecolor="g", bbox_inches="tight")
# savefig除了可以将图片保存在硬盘上之外,也可以将图片保存到类文件对象中。

# from io import StringIO
# 二进制(字节)格式的类文件对象。
from io import BytesIO
b = BytesIO()
# 保存到类文件对象中。
plt.savefig(b, dpi=50)
display(b.tell())
b.seek(0)
# b.read(50)
#  b.getvalue()

在这里插入图片描述

读取图像

from PIL import Image

image = Image.open(“c:/1.png”)

image.show()

对Image来说,open可以传递文件的路径,也可以传递一个类文件对象。

image = Image.open(b)
image.show()

颜色,点标记与线型设置

我们可以在绘制图形时,显式指定图形的颜色,点标记或线条形状。具体设置可以查看帮助文档。

  • color©:线条颜色。
  • linestyle(ls):线条形状。
  • linewidth(lw):线宽。
  • marker:点标记形状。
  • markersize(ms):点标记的大小。
  • markeredgecolor(mec):点边缘颜色。
  • markeredgewidth(mew):点边缘宽度。
  • markerfacecolor(mfc):点的颜色。

说明:

  • 颜色,点标记与线型可以使用一个参数进行设置。
  • 颜色除了可以使用预设简写的字符之外,也可以使用全称(例如red)也可以使用RGB颜色表示。

plt.plot([1, 2, 3], [4, 5, 6], “r–o”)

plt.plot([1, 2, 3], [4, 5, 6], c=“y”, ls="-.", lw=1, marker=“o”, ms=10, mec=“g”, mew=3, mfc=“r”)
在这里插入图片描述

透明度设置

在绘制图像时,我们可以通过alpha参数来控制图像的透明度,值在0 ~ 1之间。0为完全透明,1为不透明。

# 可以使用alpha参数指定图像的透明度。0完全透明,1不透明(默认)
plt.plot(5, "o", alpha=0.)

在这里插入图片描述

图例设置

在绘制多条线时,可以设置图例来标注每条线所代表的含义,使图形更加清晰易懂。
可以采用如下的方式设置图例:

  • 调用plt的legend函数,传递一个标签数组,指定每次plot图形的标签。
  • 在绘制的时候通过label参数指定图例中显示的名称,然后调用legend函数生成图例。

legend常用的参数:

  • loc:指定图例的位置。默认为best。也可以指定坐标(元组),基于图像左下角计算。
  • frameon:设置是否含有边框。
  • title:设置图例的标题。
  • ncol:图例显示的列数,默认为1。
last_year = np.random.randint(400, 500, 12)
this_year = np.random.randint(400, 500, 12)
# plt.plot(range(1, 13), last_year, marker="o")
# plt.plot(range(1, 13), this_year, marker="o")
# 设置图例 1 在legend方法中,按顺序指定每次绘图的标签。
# plt.legend(["2017", "2018"])
# 2 在绘制(plot)图形时,指定label参数值,该参数值为图例需要显示的文本。
plt.plot(range(1, 13), last_year, marker="o", label="2017")
plt.plot(range(1, 13), this_year, marker="o", label="2018")
# 设置图例时,可以通过loc属性来设置图例显示的位置。如果没有显式指定,则参数值为右上角。
# loc属性可以指定为字符串,整数值。或者是一个元组(两个float值指定比例)此时,会根据图像比例计算
# 图例显示的位置。原点在左下角。
# plt.legend(loc=(0, 0))
# frameon参数用来设置图例是否显示边框。默认为True。
# plt.legend(loc="best", frameon=False)
# 设置图例显示的标题。
# plt.legend(loc="best", title="图例标题")
# ncol参数用来设置图例显示的列数。(默认为1。)
# plt.legend(loc="best", ncol=2)

在这里插入图片描述

网格设置

可以通过plt的grid方法来设置是否显示网格。True为显示,False不显示。ax.grid(color=‘r’, linestyle=’-’, linewidth=2)

  • color:设置网格线颜色
  • axis:设置网格线显示x,y或者全部显示(x,y,both)。
  • linestyle:设置网格线形状。
  • linewidth:设置网格线宽度。
plt.plot([1, 2, 3, 4], [8, 2, 9, 6])
# 显示网格,默认不显示网格。
plt.grid(True, color="g", axis="both", linestyle="-.", linewidth=5)

在这里插入图片描述

绘图区域设置

我们可以在一张图上绘制多个图形,当然,我们也可以将不同的图形绘制到多个不同的区域当中。
我们可以采用以下方式来实现多个区域的绘制(创建子绘图区域):

  • 通过Figure对象调用add_subplot方法。
  • 通过plt的subplot方法。
  • 通过plt的subplots方法。

子区域1:add_subplot方法

  • 首先创建matplotlib.figure.Figure对象,然后通过Figure对象的add_subplot方法增加子绘图区域。
  • add_subplot方法中,需要指定子区域的行数、列数与当前要绘制的子区域。
  • add_subplot方法会返回子绘图对象(轴对象),通过该对象即可实现绘图(matplotlib.axes._subplots.AxesSubplot)。

在绘制图形时,总是需要创建Figure对象。如果没有显式创建,则plt会隐式创建一个Figure对象。在绘制图形时,既可以使用plt来绘制,也可以使用子绘图对象来绘制。
如果使用plt对象绘制,则总是在最后创建的绘图区域上进行绘制,如果此时尚未创建绘图区域,则会自动创建。

说明:

  • add_subplot方法的参数,即可以使用三个参数分开传递,也可以使用一个参数整体传递。
  • 可以通过plt.subplots_adjust方法来调整子绘图的位置与子绘图之间的距离。(left, right, top, bottom, wspace, hspace)
  • 创建子区域时,可以使用facecolor设置绘图区域的背景色。
# 创建Figure对象,然后通过调用add_subplot增加绘图区域。
# 创建Figure对象。(画图必备的底层对象)
f = plt.figure()
# 调用add_subplot增加子绘图区域对象,返回AxesSubplot类型的对象。
# 三个参数,行数,列数,当前的绘图区域
ax = f.add_subplot(1, 2, 1)
# 调用AxesSubplot对象的plot方法,进行图形绘制。
# ax.plot([1, 5, 8], [10, -3, 6])
plt.plot([1, 5, 8], [10, -3, 6])
# ax = f.add_subplot(1, 2, 2)
ax = f.add_subplot("122", facecolor="g")
# ax.plot([10, 15, 28], [1, -33, 26])
plt.plot([10, 15, 28], [1, -33, 26])

# 我们可以使用plt或者是AxesSubplot对象,调用plot方法进行绘制。
# 当我们使用plt绘制时,永远会在最后一次创建的子绘图区域上进行绘制。
# 如果当前没有子绘图区域,此时会创建一个。

# 调整距离(绘图区域之间的距离以及绘图区域与边界间的距离)
plt.subplots_adjust(wspace=0.5)

在这里插入图片描述

子区域2:subplot方法

通过调用plt的subplot方法创建子绘图区域,该方法返回子绘图对象。此种方式下,会隐式创建Figure对象。
实际上,这种创建子绘图区域的方式,底层也是通过第一种方式实现的。

# ax = plt.subplot(1, 2, 1)
plt.subplot(1, 2, 1)
plt.plot([1, 2, 3], [5, 8, 6])
plt.subplot(1, 2, 2)
plt.plot([10, 5, 8], [1, 2, 3])

在这里插入图片描述

子区域3:subplots方法

通过plt的subplots方法创建子绘图区域,该方法返回一个元组(Figure对象与所有子绘图对象,如果是多个子绘图对象,则返回一个ndarray数组)。可以通过sharex与sharey来指定是否共享x轴与y轴。

# subplots会返回一个元组。(Figure对象, 所有子绘图区域对象(数组))
# 可以使用sharex与sharey设置是否共享x(y)轴。
figure, ax = plt.subplots(1, 2, sharey=True)
ax[0].plot([10, 20, 30], "r-o")
ax[1].plot([1, 2, 3], "g-o")

在这里插入图片描述

绘图区域大小设置

如果绘图子区域较多,可能会有些拥挤。此时,我们可以调整绘图区域的大小。方式如下:

  • 在调用plt.figure()创建Figure对象时,通过figsize参数指定。单位为英寸。
  • 在创建Figure对象后,可以通过Figure对象的set_size_inches方法设置。

说明:

  • 如果没有显式创建Figure对象,可以通过plt的gcf函数获取当前的Figure对象。
# 创建Figure对象,通过figsize参数指定画布的大小。(单位:英寸)
# plt.figure(figsize=(10, 10))
# 第二种方式。创建Figure对象后,调用set_size_inches方法设置画布大小。
f = plt.figure()
# f.set_size_inches(10, 10)
# 获取当前的Figure对象。
# f = plt.gcf()
# f.set_size_inches(10, 10)
f2 = plt.gcf()
# 如果显式创建Figure对象,则获取的Figure对象就是我们创建的对象。
display(f is f2)
plt.plot([1, 2, 3], [20, 10, -5])

在这里插入图片描述

标签与刻度设置

可以通过plt对象的相关方法来设置(或获取)标签与刻度等信息。设置还是获取,取决于是否传递实际参数。

  • plt.xlim 设置或获取x轴刻度范围。
  • plt.ylim 设置或获取y轴刻度范围。
  • plt.xticks 设置或获取x轴显示的刻度与标签。
  • plt.yticks 设置或获取y轴显示的刻度与标签。
  • plt.axis 可以同时设置或获取x与y轴的刻度范围,或者是取消刻度显示。
  • 无参数:返回一个元组。(xmin, xmax, ymin, ymax)
  • (xmin, xmax, ymin, ymax) 同时设置x与y轴的刻度范围。
  • off 取消坐标轴显示。
  • tight:坐标轴紧凑显示。
  • equal:x与y具有同样的长度。

轴标签说明与标题设置

  • plt.xlabel 设置x轴的标签说明。
  • plt.ylabel 设置y轴的标签说明。
  • plt.title 设置标题。
# 关于这些方法的使用,需要注意:既可以进行设置,也可以获取相关的值。
# 设置还是获取,取决于方法的参数。当方法没有参数时,获取值。当方法具有参数时,设置值。

plt.plot([1,2,3],[10,20,30])
# 设置或获取x(y)轴的界限。
# display(plt.xlim())
# plt.xlim([0, 20])
# plt.ylim()
# plt.ylim([0, 5])
# 设置(获取)轴显示的刻度。
# plt.xticks([1, 3, 5, 7, 9])
# plt.xticks()
# xticks可以传递两个数据,第1个数组用来设置显示的刻度,第2个数据用来设置刻度显示的标签。
# 如果没有显式指定第2个数组,刻度的显示标签就等于刻度的值。
# plt.xticks([1, 5, 9], ["前期", "中期", "后期"], rotation=90)

# 可以获取或设置x与y轴的界限值。(4个值)
# plt.axis()
# plt.axis([0, 20, -1, 5])
# 不显示坐标轴。
# plt.axis("off")
# 坐标轴紧凑显示
# plt.axis("tight")
# 让坐标轴x与y的比例尺相同。
# plt.axis("equal")
# 设置x轴显示的内容。
plt.xlabel("x轴")
# 设置y轴显示的内容。
plt.ylabel("y轴")
# 设置标题。
plt.title("标题")

在这里插入图片描述

通过绘图对象设置

除了通过plt对象外,我们还可以通过子绘图对象来设置与获取标签与刻度。

  • ax.set_xlim 设置x轴刻度范围。
  • ax.get_xlim 获取x轴刻度范围。
  • ax.set_xticks 设置x轴显示的刻度。
  • ax.get_xticks 获取x轴显示的刻度。
  • ax.set_xticklabels 设置x轴显示的刻度标签。默认显示的是就是刻度值。
  • ax.get_xticklabels 获取x轴显示的刻度标签。

也可以设置标签说明与标题。

  • ax.set_xlabel 设置x轴的标签说明。
  • ax.get_xlabel 获取x轴的标签说明。
  • ax.set_title 设置标题。
  • ax.get_title 获取标题。

说明:

  • 如果需要设置或者获取y轴,只需要将x换成y即可。
  • 在设置标签时,可以使用rotation参数,令标签旋转。
ax = plt.subplot(1, 1, 1)
ax.set_xlim(10, 20)
ax.set_xticks([10, 15, 20])
ax.set_xticklabels(["早", "中", "晚"])
ax.set_xlabel("x轴")
ax.set_ylabel("y轴")
ax.set_title("标题")

在这里插入图片描述

添加注解

我们可以在图形上绘制文本等说明信息(注解)。

普通文本

plt.text 显示文本(基于坐标)
plt.figtext 显示文本(基于图片)

箭头

plt.arrow 根据起点坐标(x,y)与各自轴的长度(x + dx, y + dy)绘制箭头。

  • width 箭头尾部的宽度。
  • head_width 箭头的宽度。
  • head_length 箭头的长度。

箭头与文本

plt.annotate 显示箭头与文本。

  • xy 箭头指向坐标
  • xytext 文本起点坐标。(箭头尾部坐标)
  • arrowprops 字典类型,可设置箭头的属性。
  • facecolor 箭头的颜色
  • headwidth 箭头的宽度
  • width 箭尾的宽度
  • shrink 收缩大小
  • headlength 箭头的长度
  • arrowstyle 一些预设的箭头样式。当含有该参数时,上述4项参数将不再有效。
x = np.linspace(0, 2 * np.pi, 100)
y = np.sin(x)
plt.plot(x, y)
# 基于坐标显示文本
# plt.text(5, 0.5, "这是正弦曲线")
# 基于图像的比例,显示文本。
# plt.figtext(0.2, 0.5, "这是正弦曲线")
# 绘制箭头。x,y起始点坐标。   x + dx, y + dy 终止点坐标。  
# plt.arrow(5, 0.5, -2, -0.1, width=0.05, head_width=0.1, head_length=0.1, color="g")
# 同时绘制箭头与文本
# plt.annotate("这是正弦曲线", xy=(3, 0.25), xytext=(5, 0.5), arrowprops={"facecolor":"g", "headwidth":15, "width": 7, "shrink":0.1})
# plt.annotate("这是正弦曲线", xy=(3, 0.25), xytext=(5, 0.5), arrowprops={"arrowstyle": "<->"})
plt.annotate("这是正弦曲线", xy=(3, 0.25), xytext=(5, 0.5), arrowprops=dict(facecolor="g", headwidth=15, width=7, shrink=0.5))

在这里插入图片描述

绘图样式设置

我们可以通过plt.style.use("样式名")来设置绘图使用的样式。

说明:
执行plt.style.available来获取所有的绘图样式。

显示所有支持的样式

plt.style.available

设置参数指定的样式。

plt.style.use(“ggplot”)

x = np.linspace(0, 2 * np.pi, 100)
y = np.sin(x)
plt.plot(x, y)
plt.annotate("这是正弦曲线", xy=(3, 0.25), xytext=(5, 0.5), arrowprops=dict(facecolor="g", headwidth=15, width=7, shrink=0.5))

在这里插入图片描述

图形类型

折线图

plt.plot

# 折线图适合显示具有趋势的增加变化的数据。例如,股市走势,降雨量,气温变量。
plt.plot(np.random.randint(1, 10, 20))

在这里插入图片描述

柱形图 / 条形图

plt.bar 柱形图
plt.barh 条形图

# 柱形图,条形图适合比较数值的大小。
# plt.bar(range(1, 11), np.random.randint(100, 200, 10))
plt.barh(range(1, 11), np.random.randint(100, 200, 10))

在这里插入图片描述

饼图

plt.pie 饼图

  • labels 每个部分显示的标签。
  • explode 指定每个部分距离圆心的偏移量(单位为半径的长度)。
  • colors 指定每个部分的颜色。
  • autopct 设置每个部分显示的比例值(格式化)。
  • couterclock 是否逆时针绘图。默认为True。
  • startangle 初始绘图点位置(逆时针偏移x轴的角度)。默认为偏移0度(x轴)。
  • shadow 是否含有阴影,默认为False。
# 饼图适合于表示比例大小。(数量不宜过多,否则会显得凌乱)
# plt.pie([10, 20, 30, 40], labels=["A部门", "B部门", "C部门", "D部门"], explode=[0, 0, 0, 0.5], colors=["r", "g", "b", "y"])
# plt.pie([10, 20, 30, 40], labels=["A部门", "B部门", "C部门", "D部门"], autopct="%.2f", counterclock=False)
plt.pie([10, 20, 30, 40], labels=["A部门", "B部门", "C部门", "D部门"], startangle=90, shadow=True)

在这里插入图片描述

散点图 / 气泡图

散点图适合于用来显示与比较数据的分布状态。

  • marker 点的标记。
  • s 点的大小。
  • color 点的颜色。

说明:

  • color与s参数可以统一设置,也可以为每一个点单独设置。
# 散点图/气泡图适合表示数据整体的分布信息。
# 散点图可以表示两个维度,加上气泡大小,颜色,可以多表示两个维度。
# plt.scatter(np.random.randint(0, 100, 100), np.random.randint(0, 100, 100), s=150, color="g")

# s(点的大小)与color(点的颜色)既可以统一制定,也可以单独制定。
# plt.scatter([1, 2, 3, 4], [4, 3, 2, 1], s=[10, 20, 30, 40], color=["r", "g", "b", "y"])

size = [10, 20, 30, 40]
color = ["r", "g", "b", "y"]


plt.scatter(np.random.randint(0, 100, 100), np.random.randint(0, 100, 100),
            s=np.random.choice(size, 100), color=np.random.choice(color, 100))

在这里插入图片描述

直方图

直方图(histogram)可以看成是一种特殊的柱形图,用来将连续的数据频率(数量)进行离散化显示。在直方图中,数据被分割成若干区间,然后统计每个区间数据出现的频率(数量)。
我们可以通过plt.hist来绘制直方图。

  • bins:设置分割区间的数量。
  • normed:进行归一化显示。(概率密度)
# 直方图适合将连续值转换成离散值,方便分组统计数量。
plt.hist(np.random.randn(100), bins=10, normed=True)
# 返回的两个ndarray。
# 第一个ndarray表示每个桶中元素的数量。
# 第二个naarray表示每个桶的界限。(前闭后开,最后一个桶例外,两端都是闭区间。)

在这里插入图片描述

箱线图

箱线图也称盒须图。通过极值与Q1,Q2,Q3值来描述数据。通过箱线图,我们可以发现数据中的离群(异常)值。
箱线图的离群点定义为:Q3+1.5IQR和Q1-1.5IQR。其中IQR为两个四分位之间的距离。

# 箱线图适合分析离群值(异常值)。
x = np.random.normal(0, 10, size=1000)
plt.boxplot(x)

在这里插入图片描述

Series与DataFrame图形绘制

Series与DataFrame类型的对象也支持图形绘制,使用对象的plot方法即可。
如果我们需要绘制图形的数据就存在Series或者DataFrame对象中,我们就可以直接绘制,而无需使用plt.plot。

其他类型图形

plot默认绘制的是线形图,我们可以通过调整其kind参数的值来绘制其他类型的图形。

  • line:线形图
  • bar:柱形图
  • barh:条形图
  • hist:直方图
  • kde / density:核密度图
  • pie:饼图
  • box:箱线图
  • area:面积图

参数:

  • color
  • alpha
  • stacked:是否堆叠。

说明:
plot(kind=“类型”)也可以通过plot."类型"来进行绘制。

import pandas as pd
df = pd.DataFrame([[1, 2, 3, 4], [5, 6, 7, 8]])
display(df)
# df.plot(marker="o")
# stacked设置为True,堆叠图。
# df.plot(kind="bar", stacked=True)

# df[2].plot()

# df.plot(kind="pie", y=3)
df.plot(kind="pie", subplots=True)

在这里插入图片描述
希望对你有所帮助!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值