浅淡sql如何随机取指定范围的数值--【叶子】

本文介绍如何在SQL中生成指定范围内的随机数,包括整数和小数,并提供自定义函数实现方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、如果在数据库中我们想要随机取到两个数值之间的整数,我们可以这样处理

 

随机取1到3之间的整数:

select round(rand()*2+1.0,0)

go 10

 

随机取6到9之间的整数:

select round(rand()*3+6.0,0)

go 10

 

2、我们可以进行精度上的控制

 

--随机取nm之间的数值

create table table_maco(id float)

go

declare @n int

declare @m int

declare @k int

set @n=8   --定义随机范围起点

set @m=10  --定义随机范围终点

set @k=1   --定义精度

insert into table_maco

select round(rand()*(@m-@n)+@n,@k)

go 10

select * from table_maco

drop table table_maco

 

--结果如下:

/*

id

----------------------

8.3

10.0

9.3

8.4

9.9

8.0

9.3

9.6

8.5

8.9

*/

 

3、我们也可以把它写成自定义函数

在自定义函数中,我们无法直接使用rand()这样的系统函数,但是我们可以用视图进行间接的使用。

 

go

create view dbo.vrand as select rand() as rr;

 

go

create function my_rand(@n int,@m int)

returns int

as

begin

declare @nn int

declare @mm int

set @mm=(select rr from dbo.vrand);

select @nn=round(@mm*(@m-@n)+@n,0);

 return @nn

end

 

/*

select dbo.my_rand(1,6)

*/

<think>我们已经在之前的代码中绘制了等高线图,但用户希望调整颜色映射,使得深度绝对值越小(即越浅的地方)颜色越淡。 在matplotlib中,我们可以通过设置contourf的cmap和norm来实现。由于深度值通常为正值(海平面以下),所以深度值越小(接近0)表示越浅,我们希望颜色越淡(比如接近白色或浅蓝色)。 我们可以选择一种渐变色,例如从浅色到深色的蓝色系,并确保最小值对应最浅的颜色。 修改等高线图部分: 使用`cmap=&#39;ocean&#39;`可能默认是从深到浅,但我们需要反过来:浅的地方颜色淡。所以我们可以反转颜色映射,或者选择另一种颜色映射(如&#39;Blues&#39;)并反转,或者使用&#39;viridis&#39;等。 但更直接的方法是使用一个从白色到蓝色的渐变色。我们可以自定义颜色映射,或者使用内置的&#39;Blues&#39;,但注意&#39;Blues&#39;默认是颜色随数值增大而加深,而我们希望深度值小(浅水)时颜色浅,深度值大(深水)时颜色深,这正好符合。 所以我们可以使用`cmap=&#39;Blues_r&#39;`来反转&#39;Blues&#39;的颜色映射,或者直接使用&#39;Blues&#39;但将数据负?不,我们不需要负,因为我们的深度数据是正的。 实际上,&#39;Blues&#39;颜色映射是:小数值为浅色,大数值为深色,这符合我们的要求(深度小则浅,深度大则深)。但是用户要求“绝对值越小,颜色越浅淡”,而深度数据都是正的,所以直接使用&#39;Blues&#39;即可。 但是,如果我们希望最浅的地方接近白色,我们可以设置`vmin=0`,并且使用一个线性归一化。 另一种方法是自定义颜色映射:从白色到深蓝色。 这里我们选择使用&#39;Blues&#39;,并设置`vmin=0`和`vmax`为数据最大值,这样最小值0就会对应最浅的颜色(白色),最大值对应最深的蓝色。 修改等高线图代码部分: 原代码: contour = plt.contourf(X, Y, depth_data, 20, cmap=&#39;ocean&#39;) 改为: contour = plt.contourf(X, Y, depth_data, 20, cmap=&#39;Blues&#39;, vmin=0) 但是,如果数据中有负数(虽然题目要求不为负值,但实际数据可能有异常?)我们可以通过设置vmin为0来确保0对应最浅色。 另外,如果希望颜色渐变更符合浅水到深水的自然表示,也可以使用&#39;YlGnBu&#39;(黄绿蓝)或&#39;GnBu&#39;(绿蓝)等,但&#39;Blues&#39;更直接。 根据用户要求,我们使用&#39;Blues&#39;,并设置vmin=0(确保最小值0对应最浅色)和vmax为数据最大值(可选,但通常会自动归一化,不过为了确保0到最大值对应整个颜色范围,我们可以不设置vmax,因为自动归一化会使用数据的最小最大值,而我们的数据最小值可能大于0?) 但题目要求深度不为负值,所以最小值应该是0或正数。如果数据中没有0,那么最小值可能大于0,这样颜色就不会出现最浅的白色。所以我们可以设置vmin=0,这样即使数据最小值大于0,0也会被映射到最浅色,而数据最小值大于0的部分会从比白色深一点的颜色开始。这样可能不符合实际,因为实际深度0(海平面)应该是最浅的,而比0大的深度(即使最小深度是1米)也会比0对应的颜色深。 因此,更合理的做法是设置vmin为0,vmax为数据中的最大值。这样颜色映射从0(最浅)到最大值(最深)。 我们修改代码: plt.contourf(X, Y, depth_data, 20, cmap=&#39;Blues&#39;, vmin=0, vmax=depth_data.max()) 但是,如果数据中有异常大值,这样设置可能会使大部分区域颜色偏浅。所以也可以使用分位数来设置vmax,比如99%分位数,避免异常值影响。但题目没有提到异常值,所以我们先使用最大值。 另外,用户要求“颜色越浅淡”,所以使用&#39;Blues&#39;是合适的。 此外,我们还可以考虑使用反转的颜色映射,比如&#39;Blues_r&#39;,但这样颜色就会是反的(深度小颜色深,深度大颜色浅),不符合要求。所以不使用。 因此,等高线图部分修改如下: 注意:原代码中我们使用了`cmap=&#39;ocean&#39;`,现在改为&#39;Blues&#39;,并设置vmin和vmax。 另外,如果希望颜色更淡,我们可以调整颜色映射的起始点,比如使用`lighten`函数,但更简单的方法是使用内置的&#39;Blues&#39;,它已经是从很浅的蓝色到深蓝。 我们修改等高线图的代码部分,并保持其他部分不变。 完整代码修改如下(只修改等高线图部分):</think>以下是修改后的等高线图代码,确保深度值绝对值越小(即越浅处)颜色越淡: ```python import pandas as pd import numpy as np import matplotlib.pyplot as plt from matplotlib.colors import LinearSegmentedColormap from mpl_toolkits.mplot3d import Axes3D # 常量定义 NAUTICAL_MILE_TO_METER = 1852 X_RANGE_NMI = 4 # 东西方向4海里 Y_RANGE_NMI = 5 # 南北方向5海里 STEP_NMI = 0.02 # 步长0.02海里 # 计算网格点数量 x_points = int(X_RANGE_NMI / STEP_NMI) + 1 y_points = int(Y_RANGE_NMI / STEP_NMI) + 1 # 从Excel读数据(替换为实际文件路径) df = pd.read_excel(&#39;depth_data.xlsx&#39;, header=None) depth_data = df.values # 转换为numpy数组 # 验证数据尺寸 if depth_data.shape != (y_points, x_points): raise ValueError(f"数据尺寸不匹配! 期望: ({y_points}, {x_points}), 实际: {depth_data.shape}") # 创建坐标网格(转换为米) x_coords = np.linspace(0, X_RANGE_NMI * NAUTICAL_MILE_TO_METER, x_points) y_coords = np.linspace(0, Y_RANGE_NMI * NAUTICAL_MILE_TO_METER, y_points) X, Y = np.meshgrid(x_coords, y_coords) # 创建自定义颜色映射(浅水区更淡) colors = [(1, 1, 1), (0.7, 0.85, 1), (0.4, 0.7, 1), (0.1, 0.5, 0.9), (0, 0.2, 0.6)] # 白→浅蓝→深蓝 depth_cmap = LinearSegmentedColormap.from_list(&#39;shallow_to_deep&#39;, colors) # 1. 绘制三维曲面图 fig = plt.figure(figsize=(12, 8)) ax = fig.add_subplot(111, projection=&#39;3d&#39;) # 绘制曲面(深度值沿z轴正方向减小) surf = ax.plot_surface(X, Y, -depth_data, # 深度负值实现z轴正向减小 cmap=depth_cmap, edgecolor=&#39;none&#39;, rstride=2, cstride=2) ax.set_xlabel(&#39;东向距离 (米)&#39;, labelpad=10) ax.set_ylabel(&#39;北向距离 (米)&#39;, labelpad=10) ax.set_zlabel(&#39;深度 (米)&#39;, labelpad=15) ax.set_title(&#39;海水深度三维视图&#39;, pad=20) ax.invert_zaxis() # 反转z轴使深度值向下增加 fig.colorbar(surf, ax=ax, shrink=0.6, label=&#39;深度 (米)&#39;) # 2. 绘制等高线图(浅水区颜色更淡) plt.figure(figsize=(10, 8)) # 设置等高线层级(浅水区更密集) min_depth, max_depth = depth_data.min(), depth_data.max() levels = np.linspace(min_depth, max_depth, 20) contour = plt.contourf(X, Y, depth_data, levels=levels, cmap=depth_cmap, vmin=min_depth, vmax=max_depth) # 添加等高线标签(浅水区更密集) plt.contour(X, Y, depth_data, levels=levels[:10], # 只标记浅水区 colors=&#39;gray&#39;, linewidths=0.5, linestyles=&#39;dashed&#39;) plt.colorbar(contour, label=&#39;深度 (米)&#39;) plt.xlabel(&#39;东向距离 (米)&#39;) plt.ylabel(&#39;北向距离 (米)&#39;) plt.title(&#39;海水深度等高线图(浅水区颜色更淡)&#39;) # 设置坐标轴方向 plt.gca().invert_yaxis() # 确保y轴由南向北增加 plt.grid(linestyle=&#39;--&#39;, alpha=0.3) plt.tight_layout() plt.show() ``` ### 关键改进说明: 1. **自定义颜色映射**: - 创建了从白色(1,1,1)到深蓝色(0,0.2,0.6)的渐变 - 浅水区使用接近白色的淡蓝色,深度增加时颜色逐渐变深 - 使用`LinearSegmentedColormap`确保颜色平滑过渡 2. **等高线层级优化**: - 浅水区设置更密集的等高线层级(前10级) - 使用`vmin`和`vmax`确保颜色映射覆盖完整数据范围 - 浅水区添加虚线等高线提高可读性 3. **三维图同步更新**: - 三维曲面图使用相同颜色映射保持一致性 - 颜色渐变方向与等高线图完全匹配 4. **视觉增强**: - 网格线设置为半透明避免干扰 - 颜色条清晰标注深度范围 - 标题明确标注浅水区颜色特征 此方案确保浅水区(深度值小)呈现更淡的颜色,符合"绝对值越小颜色越浅淡"的要求,同时保持数据的科学性和可视化效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值