matplotlib
基本参数配置#
import numpy as np
import pandas as pd
from pandas import Series, DataFrame
import matplotlib.pyplot as plt
# 如果浏览器不显示图片,就需要加上这句话
%matplotlib inline
# 让图片可以显示中文
plt.rcParams['font.sans-serif'] = 'SimHei'
# 让图片可以显示负号
plt.rcParams['axes.unicode_minus'] = False
# 运行时配置参数
# rcParams:runtime configuration Parameters
# 支持svg矢量图
%config Inlinebackend.figure_format = 'svg'
#查看自己电脑上的字体库
from matplotlib.font_manager import FontManager
fm = FontManager()
my_fonts = set(f.name for f in fm.ttflist)
my_fonts
样式和颜色
样式:'-', '--', '-.', ':', 'None', ' ', '', 'solid', 'dashed', 'dashdot', 'dotted'
颜色:b(蓝色),g(绿色),r(红色),c(青色),m(品红),y(黄色),k(黑色),w(白色)
# 抛物线
x = np.linspace(-5,5)
y = x**2
# color:颜色
# ls:linestyle 线的样式
# plt.plot(x,y,color="red",ls="-")
plt.plot(x,y,"b--")
画布配置#
# 画布配置
# figsize:画布大小,宽高
# dpi:分辨率,像素密度
plt.figure(figsize=(10,3), dpi=100, facecolor="g")
x = np.linspace(0, np.pi*2)
y = np.sin(x)
plt.plot(x,y)
# 设置网格
plt.grid()
# 在一个画布上绘制多个图
# 立刻显示图片 show
# 如果放在代码最后,会在一张图上显示所有线
# 放在中间,会先将之前的线画一张图,之后的线另开辟图画
plt.figure(figsize=(5,3))
x = np.linspace(0,8)
plt.plot(x, np.sin(x))
plt.show()
plt.plot(x, np.cos(x), 'r')
plt.plot(x, -np.sin(x), 'g--')
多图布局#
# plt.subplot()画子图
fig = plt.figure(figsize=(6,4))
x = np.linspace(-np.pi,np.pi,30)
y = np.sin(x)
# 子图1
ax1 = plt.subplot(221) # 2行2列中的第1个图
ax1.plot(x,y)
ax1.set_title("子图1")
# 子图2
ax2 = plt.subplot(222) # 2行2列中的第2个图
ax2.plot(x,y)
ax2.set_title("子图2")
# 子图3(当超过10时用这种写法比较好)
ax3 = plt.subplot(2,2,3) # 2行2列中的第3个图
ax3.plot(x,y)
ax3.set_title("子图3")
# 子图4(当超过10时用这种写法比较好)
ax4 = plt.subplot(2,2,4) # 2行2列中的第4个图
ax4.plot(x,y)
ax4.set_title("子图4")
# tight_layout自动调整布局,中文是紧凑布局的意思,
# 作用:使图像不重叠
fig.tight_layout()
fig = plt.figure(figsize=(6,4))
x = np.linspace(-np.pi,np.pi,30)
y = np.sin(x)
# 子图1
ax1 = plt.subplot(2,2,1) # 2行2列中的第1个图
ax1.plot(x,y)
ax1.set_title("子图1")
# 子图2
ax2 = plt.subplot(2,2,2) # 2行2列中的第2个图
ax2.plot(x,y)
ax2.set_title("子图2")
# 子图3(当超过10时用这种写法比较好)
ax3 = plt.subplot(2,1,2) # 2行1列中的第2个图
ax3.plot(x,y)
ax3.set_title("子图3")
# plt.subplots()会一次将子图都生成
x = np.linspace(0,np.pi*2)
# 3行*3列
fig, ax = plt.subplots(3,3)
ax1,ax2,ax3 = ax
ax11,ax12,ax13 = ax1
ax21,ax22,ax23 = ax2
ax31,ax32,ax33 = ax3
# fig设置画布大小
fig.set_figwidth(8)
fig.set_figheight(5)
# 第一行
ax11.plot(x,np.sin(x))
ax12.plot(x,np.cos(x))
ax13.plot(x,np.tan(x))
# 第一行
ax11.plot(x,np.sin(x))
ax12.plot(x,np.cos(x))
ax13.plot(x,np.tan(x))
# 第二行
ax21.plot(x,np.sinh(x))
ax22.plot(x,np.cosh(x))
ax23.plot(x,np.tanh(x))
# 第二行
ax31.plot(x,np.sin(x) + np.cos(x))
ax32.plot(x,np.sin(x) + np.tan(x))
ax33.plot(x,np.cos(x) + np.tan(x))
图形嵌套#
# 方式一:fig.add_subplot
fig = plt.figure(figsize=(8,5))
# 子图1
axes1 = fig.add_subplot(1,1,1)
axes1.plot([0,1], [1,3])
# 子图2:嵌套图
axes2 = fig.add_subplot(2,2,1,facecolor="pink")
axes2.plot([1,3]) # 可以直接写[1,3]
# 方式二
fig = plt.figure(figsize=(8,5))
x = np.linspace(0,2*np.pi,30)
y = np.sin(x)
plt.plot(x,y)
# [left,bottom,width,height]
axes1 = plt.axes([0.55,0.55,0.3,0.3])
axes1.plot(x,y,color='g')
# 嵌套图2
axes2 = fig.add_axes([0.2,0.2,0.2,0.2])
axes2.plot(x,y,'r')
双轴显示(组合图)#
plt.figure(figsize=(8,5))
x = np.linspace(0,10,100)
# 图1
# 获取当前的坐标轴。
axes1 = plt.gca()
axes1.plot(x,np.exp(x),c='r')
# 子图要用set_xlabel
axes1.set_xlabel("time")
axes1.set_ylabel("exp", c="r")
axes1.tick_params(axis="y",labelcolor="r")
# 图2
axes2 = axes1.twinx() # 和图1共享x轴
axes2.plot(x,np.sin(x),c='b')
axes2.set_ylabel("sin", c="b")
axes2.tick_params("y", labelcolor="b")
绘图属性设置#
图例#
# 图例:legend
plt.figure(figsize=(6,4))
x = np.linspace(0, 2*np.pi)
plt.plot(x,np.sin(x),label="sin")
plt.plot(x,np.cos(x),label="cos")
# 图例
plt.legend(['sin','cos'],
fontsize=18,
loc='center', # loc='best'表示最佳位置展示图例(默认best)
ncol=2, # 显示成几列
bbox_to_anchor=[0,1,1,0.2] # 控制具体位置 # loc='center'会影响其
)
线条属性#
# c:color颜色
# ls:1ine style线样式
# lw:1ine width 线宽度
# marker:标记样式
# mfc:marker facecolor标记的背景颜色
# markersize:标记大小
# markeredgecolor:标记边缘颜色
# markeredgewidth:标记边缘宽度
# label:标签(配合图例使用)
# alpha:透明度
plt.figure(figsize=(6,4))
x = np.linspace(0,2*np.pi,8)
y1 = np.sin(x)
y2 = np.cos(x)
plt.plot(x,y1,ls='--',lw='2',
marker='.',mfc='r',markersize=20,markeredgecolor='g',markeredgewidth=3,
label="sin",alpha=0.2)
plt.plot(x,y2,ls='--',lw='2',
marker='.',mfc='r',markersize=20,markeredgecolor='b',markeredgewidth=3,
label="cos",alpha=0.2)
plt.legend(['sin','cos'])
坐标轴刻度#
# tick:刻度
plt.figure(figsize=(6,4))
x = np.linspace(0,2*np.pi)
y = np.sin(x)
plt.plot(x,y)
# 设置刻度
plt.xticks(np.arange(0,7), fontsize=20, c='r')
plt.yticks([-1,0,1], # 刻度值
labels=['min','0','max'], # 显示刻度标签
fontsize=20,
c='b',
ha='right', # horizontal alignment:y轴刻度的水平对齐方式,默认right右对齐
)
坐标轴范围和配置#
# plt.xlim设置坐标轴范围
plt.figure(figsize=(6,4))
x = np.linspace(0,2*np.pi)
y = np.sin(x)
plt.plot(x,y)
# 设置坐标轴范围
plt.xlim(-5,10)
plt.ylim(-2,2)
# 设置坐标轴配置
plt.figure(figsize=(6,4))
x = np.linspace(0,2*np.pi)
y = np.sin(x)
plt.plot(x,y)
# plt.axis设置坐标轴范围
# 顺序:[xmin,xmax,ymin,ymax]
plt.axis([-5,10,-2,2])
# option
# off:不显示坐标轴
# equal:会让x轴y轴刻度距离相等
# scaled:自动缩放坐标轴和图片匹配
# tight:紧凑型自动适配图片
# square:让画布呈现正方形,x轴和y轴宽高一致
plt.axis("square")
网格线与标题#
plt.figure(figsize=(6,4))
x = np.linspace(0,2*np.pi)
y = np.sin(x)
plt.plot(x,y)
# 图的标题
plt.title("sin曲线",
fontsize=20,
c="red",
loc="center") # 位置,默认center
# 父标题
plt.suptitle("我是父标题",
y=1.1, # 位置
fontsize=26)
# 网格线
plt.grid(ls='--', # 线条样式
lw=2, # 线条宽度
c='gray', # 颜色
axis='y', # 只显示y轴方向虚线
)
标签#
plt.figure(figsize=(6,4))
x = np.linspace(0,2*np.pi)
y = np.sin(x)
plt.plot(x,y)
# rotation:旋转角度,xlabel默认是0,ylabel默认是90
# horizontalalignment | ha: 水平对齐方式
# va:垂直对齐方式
plt.xlabel("y=sin(x)", fontsize=20, rotation=45)
plt.ylabel("y=sin(x)", fontsize=20, rotation=0, ha="right", va='top')
plt.title("正弦曲线")
画文本#
plt.figure(figsize=(5,3))
x = np.linspace(0,10,10)
y = np.array([60,30,20,90,40,60,50,80,70,30])
plt.plot(x,y,ls='--', marker='o')
# 画文字
for a,b in zip(x,y):
plt.text(
x=a, # x轴坐标
y=b, # y轴坐标
s=b, # 内容
fontsize=15, # 大小
color='r', # 颜色
ha='center', # 水平对齐方式
va='bottom', # 垂直对齐方式
)
注释#
plt.figure(figsize=(5,3))
x = np.linspace(0,10,10)
y = np.array([60,30,20,90,40,60,50,80,70,30])
plt.plot(x,y,ls='--', marker='o')
# 注释
plt.annotate(
text="最高销量", # 文本
xytext=(1,80), # 起始点坐标(文本坐标)
xy=(3,90), # 指向点坐标
# 箭头属性
arrowprops={
'width': 2, # 箭头线宽度
'headwidth': 8, # 箭头宽度
'facecolor': 'r', # 箭头整体填充颜色
}
)
保存#
# savefig
fig = plt.figure(figsize=(5,3))
x = np.linspace(0,10,10)
y = np.array([60,30,20,90,40,60,50,80,70,30])
plt.plot(x,y,ls='--', marker='o')
fig.savefig(
fname="图1.jpg", # 文件扩展名支持:jpg,png
dpi=200, # 像素密度
facecolor="pink", # 背景颜色
pad_inches=0.5, # 内边距
)
折线图#
绘制一条线#
plt.figure(figsize=(5, 3))
x = ["Mon", "Tues", "Wed", "Thur", "Fri", "Sat","Sun"]
y = [20,40,35,55,42,80,50]
plt.plot(x, y, c='g', marker='D', markersize=3)
plt.xlabel("星期")
plt.ylabel("活跃度")
plt.title("python语言活跃度")
# 文本
for a,b in zip(x,y):
plt.text(a,b,b,ha="center",va="bottom")
绘制多条线#
fig = plt.figure(figsize=(5,3))
x = np.random.randint(0,10,size=15)
plt.plot(x,marker="*",c='r')
plt.plot(x.cumsum(), marker="o", c='b')
plt.savefig("bbb.jpeg")
# 构造表格数据
np.random.seed(0)
dict1= {
"月份": [f"{i}月" for i in range(1,11)],
"语文": np.random.randint(0,100,size=10),
"数学": np.random.randint(0,100,size=10),
"英语": np.random.randint(0,100,size=10),
}
dict1
# 生成表格用于后续测试
df1 = DataFrame(dict1)
x,y1,y2,y3 = df1["月份"], df1["语文"], df1.数学, df1.英语
display(x,y1,y2,y3)
# mfc:标记填充颜色
# ms:markersize标记大小
plt.plot(x,y1,label="语文",c="g",ls="--",marker="*",mfc="w",ms=10,alpha=0.6)
plt.plot(x,y2,label="数学",c="b",ls="-",marker="o",mfc="w",ms=10,alpha=0.6)
plt.plot(x,y3,label="英语",c="r",ls=":",marker=">",mfc="w",ms=10,alpha=0.6)
plt.yticks(range(0,111,10))
plt.xlabel("月份")
plt.ylabel("成绩")
plt.title("成绩的变化趋势")
plt.legend()
plt.grid(axis="y",ls="--")
柱形图#
简单柱形图#
x = ["语文", "数学", "英语","python","化学"]
y = [20,10,40,60,10]
plt.figure(figsize=(5,3))
plt.bar(x,y)
配置柱形图#
# 构造表格数据
dict2 = {
"年份": [i for i in range(2014,2021)],
"销售额": np.random.randint(1000000,2000000, 7),
}
df2 = DataFrame(dict2)
fig = plt.figure(figsize=(5,3))
plt.title("年销售额")
plt.xlabel("年份")
plt.ylabel("销售额")
x,y = df2["年份"],df2["销售额"]
plt.bar(x,y,width=0.6)
# 在每个柱子上显示数值
for a,b in zip(x,y):
plt.text(
a,
b,
s="{:.1f}万".format(b/10000),
ha="center",
va="bottom"
)
一次绘制多个柱状图(簇状柱形图)#
dict3 = {
"年份": [i for i in range(2014,2021)],
"北区": np.random.randint(100000,10000000,7),
"中区": np.random.randint(100000,10000000,7),
"南区": np.random.randint(100000,10000000,7),
}
df3 = DataFrame(dict3)
x,y1,y2,y3 = df3["年份"], df3["北区"],df3["中区"],df3["南区"]
fig = plt.figure(figsize=(5,3))
plt.title("年销售额")
plt.xlabel("年份")
plt.ylabel("销售额")
w = 0.2
plt.bar(x-w,y1,width=w, label="北区")
plt.bar(x,y2,width=w, label="中区")
plt.bar(x+w,y3,width=w, label="南区")
plt.legend()
堆叠柱状图#
x,y1,y2,y3 = df3["年份"], df3["北区"],df3["中区"],df3["南区"]
fig = plt.figure(figsize=(5,3))
plt.title("年销售额")
plt.xlabel("年份")
plt.ylabel("销售额")
plt.bar(x, y1, label="北区")
plt.bar(x, y2, label="中区", bottom=y1)
plt.bar(x, y3, label="南区", bottom=y1+y2)
plt.legend()
条形图#
plt.barh(x,y)
直方图#
直方图(Histogram),又称质量分布图,它是柱形图的一种,由一系列高度不等的纵向线段来表示数据分布的情况。直方图的
横轴表示数据类型,纵轴表示分布情况。
直方图用于概率分布,它显示了一组数值序列在给定的数值范围内出现的概率或次数。
x = np.random.randint(0,10,100)
x
# 统计每个数出现的次数
Series(x).value_counts()
# 直方图
# bins:组数
# plt.hist(x, bins=5) # 5组
plt.hist(x,bins=[0,3,6,10]) # 左闭右开
plt.xticks(range(10))
# 构造表格
df4 = DataFrame(
{"分数": np.random.randint(0,100,1000)}
)
x = df4["分数"]
df4
x.min(), x.max()
# 直方图
plt.hist(x, bins=range(0,101,10), facecolor="r", alpha=0.4, edgecolor='k')
# 概率分布 density=True
plt.hist(x, bins=range(0,101,10), facecolor="r", alpha=0.4, edgecolor='k', density=True)
箱型图#
结构:
异常值
最大值
3/4 Q3
2/4 中位数
1/4 Q1
最小值
异常值
x = [1,2,3,5,7,9,20]
# 最大值
plt.boxplot(x)
一次画多个箱形图#
x1 = np.random.randint(10,100,100)
x2 = np.random.randint(10,100,100)
x3 = np.random.randint(10,100,100)
plt.boxplot([x1,x2,x3])
data = np.random.normal(size=(500,4))
data.shape
plt.boxplot(
data,
label=["A","B","C","D"],
notch=True, # 箱型图样式
sym="g*", # 异常值的颜色,形状
)
散点图#
表示了因变量随自变量变化的趋势
散点图#
x = range(1,7)
y = range(10,70,10)
plt.scatter(x,y)
气泡图#
plt.figure(figsize=(5,3))
data = np.random.randn(100,2)
s = np.random.randint(50,200,100)
c = np.random.randn(100)
# s:大小
# c:颜色
plt.scatter(data[:,0], data[:,1], s=s, c=c, alpha=0.6)
# 分析广告费用和销售收入之间的关系
mydict = {
"广告费用": np.random.randint(0,100,100),
"销售收入": np.random.randint(0,100,100),
}
# 构造表格
df5 = DataFrame(
mydict
)
x,y = df5["广告费用"],df5["销售收入"]
plt.scatter(x,y)
plt.title("告费用和销售收入之间的关系")
plt.xlabel("广告费用")
plt.ylabel("销售收入")
六边形图#
fig = plt.figure(figsize=(5,3))
plt.hexbin(x, y, gridsize=20, cmap="rainbow")
plt.title("告费用和销售收入之间的关系")
plt.xlabel("广告费用")
plt.ylabel("销售收入")
饼图#
饼图#
x = [10,20,30,40]
# autopct:显示百分比
plt.pie(x, autopct='%.2f%%')
import re
# 构造数据
s = """
广东
山东
湖北
江苏
浙江
河北
广西
上海
北京
四川"""
# re.sub会将所有匹配\s的空白字符替换为空字符串
# sub全拼:substitute替换
s = re.sub("\s", "", s)
s_len = len(s)
city_list = []
for i in range(s_len):
if i%2==0:
city_list.append(s[i:i+2])
city_list
values = np.random.randint(1000,10000,10)
city_list
[0 for i in range(10)]
# pct全拼:percentage
plt.pie(
x=values,
autopct="%.1f%%", # 显示百分比
pctdistance=0.8, # 显示文字位置
labels=city_list, # 标签
labeldistance=1.3, # 标签位置
# shadow=True, # 阴影
textprops={'fontsize':14, "color":"red"}, # 文字属性
explode=[0, 0, 0, 0, 0.5, 0, 0, 0, 0.1, 0] # 脱离扇形(分裂效果)
)
甜甜圈#
# 单个圆环
plt.pie(
x=values,
autopct="%.1f%%", # 显示百分比
pctdistance=0.8, # 显示文字位置
labels=city_list, # 标签
textprops={'fontsize':14, "color":"k"}, # 文字属性
# 甜甜圈设置
wedgeprops={"width":0.4, "edgecolor":"w"},
)
# 多个圆环
plt.figure(figsize=(8,8))
# 第一个圆环
plt.pie(
x=values,
autopct="%.1f%%", # 显示百分比
pctdistance=0.8, # 显示文字位置
labels=city_list, # 标签
textprops={'fontsize':14, "color":"k"}, # 文字属性
# 甜甜圈设置
wedgeprops={"width":0.4, "edgecolor":"w"},
)
# 第二个圆环
plt.pie(
x=np.random.randint(1000,10000,10),
autopct="%.1f%%", # 显示百分比
pctdistance=0.8, # 显示文字位置
textprops={'fontsize':8, "color":"k"}, # 文字属性
radius=0.6
)
plt.legend(city_list,fontsize=10)
面积图#
面积图又称区域图,和折线图差不多,强调y轴随x轴而变化的程度,可用于引起人们对总值趋势的注意
x = [1,2,3,4,5]
y = np.random.randint(10,100,5)
plt.stackplot(x,y)
x = [i for i in range(2014,2021)]
y = np.random.randint(1000,10000,7)
fig = plt.figure(figsize=(5,3))
plt.stackplot(x,y)
plt.plot(x,y)
热力图#
热力图是一种通过对色块着色来显示数据的统计图表。绘图时,需指定颜色映射的规则。
data = np.random.randint(100,10000,(10,6))
fig = plt.figure()
plt.imshow(data, cmap="Blues")
plt.xticks([0,1,2,3,4,5,], labels=["产品1", "产品2", "产品3", "产品4", "产品5", "产品6", ])
plt.yticks(range(10), ['广东', '山东', '湖北', '江苏', '浙江', '河北', '广西', '上海', '北京', '四川'])
for i in range(10):
for j in range(6):
plt.text(
j,
i,
s=data[i][j],
ha="center",
va="center",
fontsize=10,
)
plt.colorbar()
极坐标图#
极坐标系是一个二维坐标系统,该坐标系统中任意位置可由一个夹角和一段相对原点一极点的距离来表示
N = 8
# endpoint:表示不包含最后一个点
x = np.linspace(0, 2*np.pi, N, endpoint=False)
height = np.random.randint(3,15,8)
# 画图
axes = plt.subplot(111, projection="polar")
axes.bar(x,height, width=2*np.pi/N, color=np.random.rand(8,3)) # np.random.rand(8,3):生成[0,1)之间随机小数,这里可以生成随机颜色
雷达图#
雷达图是从同一点开始的轴上表示的三个或更多个变量的二维图表的形式显示多变量数据的图形方法
x = np.linspace(0, 2*np.pi, 6, endpoint=False)
y = [80,60,90,70,40,100]
# 首尾相连
x = np.concatenate((x,[x[0]]))
y = np.concatenate((y,[y[0]]))
axes = plt.subplot(111, polar=True)
axes.plot(
x,y,
'o-', # 'o-':表示标记 + 实线
lw=2, # 线宽
)
# 填充
axes.fill(x,y, alpha=0.3)
# 设置刻度
axes.set_rgrids([20,30,40,60,90,100], fontsize=12)
等高线图#
# 解释 np.meshgrid
a = np.array([1,2,3])
b = np.array([4,5])
A,B = np.meshgrid(a,b)
display(A,B)
fig = plt.figure(figsize=(5,5))
x = np.linspace(-5,5,100)
y = np.linspace(-5,5,100)
# np.meshgrid会将x,y变为网格形式
X,Y = np.meshgrid(x,y)
Z = np.sqrt(X**2 + Y**2)
# 等高线图
cb = plt.contourf(X,Y,Z)
# 色柱
plt.colorbar(cb)
3D图#
# 导入3D引擎
from mpl_toolkits.mplot3d.axes3d import Axes3D
三维折线图#
fig = plt.figure(figsize=(5,3))
x = np.linspace(0,100,400)
y = np.sin(x)
z = np.cos(x)
# 三维折线图
axes = Axes3D(fig, auto_add_to_figure=False)
fig.add_axes(axes)
axes.plot(x,y,z)
三维散点图#
fig = plt.figure(figsize=(5,3))
x = np.random.randn(50)
y = np.random.randn(50)
z = np.random.randn(50)
# 三维散点图
axes = Axes3D(fig, auto_add_to_figure=False)
fig.add_axes(axes)
axes.scatter(x,y,z,color='r',s=100) # s:点大小
三维柱形图#
fig = plt.figure(figsize=(5,3))
# 三维柱形图
axes = Axes3D(fig, auto_add_to_figure=False)
fig.add_axes(axes)
x = np.arange(1,5)
for m in x:
plt.bar(
np.arange(4),
np.random.randint(0,100,4),
zs=m, # zs:每个图之间间距
zdir='x', # zdir:在哪个方向上排列
width=0.6,
alpha=0.7
)
axes.set_xlabel("x轴")
axes.set_ylabel("y轴")
axes.set_zlabel("z轴")
图像处理#
img = plt.imread("bbb.jpeg")
img
# (300, 500, 3)是个3维数组
# 300:高度方向像素个数
# 500:宽度方向像素个数
# 3:代表每个像素点[a,b,c]
img.shape
plt.imshow(img)
# 垂直翻转:上下反转
# 方式一
plt.imshow(img,origin="lower")
# 方式二
plt.imshow(img[::-1])
# 水平翻转(左右翻转)
plt.imshow(img[:,::-1])
# 截取
# y方向0-200,x方向0-300
img2 = img[:200,:300]
plt.imshow(img2)
# 将截取之后的图片保存
plt.imsave("ccc.jpeg", img2)
作者:cloud-2-jane
出处:https://www.cnblogs.com/cloud-2-jane/articles/18638249
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架