鱼C论坛

 找回密码
 立即注册
查看: 1315|回复: 1

[已解决]python 出图遇到问题

[复制链接]
发表于 2023-4-6 15:30:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
import os
import pandas as pd
import numpy as np
from scipy.interpolate import Rbf
import matplotlib.pyplot as plt

#js_box=np.array([97,21,110,34.5])
#grid_lon = np.linspace(js_box[0],js_box[2],400)#设置网格经度
#grid_lat = np.linspace(js_box[1],js_box[3],400)#设置网格经度
#filename=r'D:\NRD\sxh'#数据文件地址
#df=pd.read_csv(filename)#读取文件
#lons=df['lon']#读取站点经度
#lats=df['lat']#读取站点纬度
#extent=[int(js_box[0]),int(js_box[2]),int(js_box[1]),int(js_box[3])]#定义绘图范围
#olon,olat=np.meshgrid(grid_lon,grid_lat)#网格化


plt.rcParams['font.sans-serif'] = ['SimHei']

csv_folder = "D:\NRD\sxh"
df_list = []
for filename in os.listdir(csv_folder):
    if filename.endswith(".csv"):
        filepath = os.path.join(csv_folder, filename)
        df = pd.read_csv(filepath)
        df_list.append(df)

# 合并所有DataFrame
df = pd.concat(df_list, ignore_index=True)
df["lat"] = df["lat"].apply(lambda x: x / 100.0 if x > 1800 else x / 10)
df["lon"] = df["lon"].apply(lambda x: x / 100.0 if x > 1800 else x / 10)
df



columns = ['R95P', 'RD95', 'RI95', 'RC95', 'PPER', 'R99p']
columns_name = ['极端降水量', '极端降水频数', '极端降水强度', '极端降水贡献率', '降水百分率', '极端强降水量']
columns_name = dict(zip(columns, columns_name))


def plot_year_data():
    for col in columns:
        yearly_data = df.groupby("year")[col].mean()
        plt.plot(yearly_data.index, yearly_data.values)
        # 设置图表标题和轴标签
        plt.title(f"年平均{columns_name[col]}")
        plt.xlabel("年份")
        plt.ylabel(columns_name[col])

        # 显示图表
        plt.savefig(f"plots/year-{col}.jpg", dpi=300)
        plt.show()
plot_year_data()


想问问大佬们,运行没有报错但是不输出图是什么问题,还有就是第七行后面那一段#是我想要加进去的想设置图片经纬边界,能实现吗?
最佳答案
2023-4-6 16:51:15
本帖最后由 歌者文明清理员 于 2023-4-6 16:52 编辑

关于第一个问题,代码中已经将图表保存到文件夹中了,因此没有直接显示出来。你可以在图片所在的文件夹中找到生成的图片。

关于第二个问题,代码中的注释是正确的,可以设置绘图范围。你需要将注释取消掉并根据需要修改 js_box 的数值和地图上划分网格的数量。然后可以在 Rbf 插值之前使用 meshgrid 函数创建网格点坐标,如下所示:
js_box = np.array([min(df['lon']), min(df['lat']), max(df['lon']), max(df['lat'])])
grid_lon = np.linspace(js_box[0], js_box[2], 400)
grid_lat = np.linspace(js_box[1], js_box[3], 400)
olon, olat = np.meshgrid(grid_lon, grid_lat)
然后,在 plot_year_data() 函数中,你需要将数据限制在这个范围内,并且使用 meshgrid 创建的网格点坐标进行插值。根据注释中的提示,你需要在 df 中选取相应的经纬度和数据列,然后使用 Rbf 插值函数创建一个函数对象,在网格点处求解这个函数的值即可,如下所示:
# 在 df 中选取经纬度和数据列
sub_df = df[['lon', 'lat', col]]

# 创建 Rbf 插值函数对象
rbf = Rbf(sub_df['lon'], sub_df['lat'], sub_df[col], function='linear')

# 在网格点处求解插值函数的值
z = rbf(olon, olat)
最后,你需要使用 imshow 或 contourf 函数绘制插值后的数据。例如,可以使用 contourf 函数创建一个填充等值线图:

python
plt.contourf(olon, olat, z)
plt.colorbar()
plt.title(f"年平均{columns_name[col]}")
plt.xlabel("经度")
plt.ylabel("纬度")
plt.show()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-6 16:51:15 | 显示全部楼层    本楼为最佳答案   
本帖最后由 歌者文明清理员 于 2023-4-6 16:52 编辑

关于第一个问题,代码中已经将图表保存到文件夹中了,因此没有直接显示出来。你可以在图片所在的文件夹中找到生成的图片。

关于第二个问题,代码中的注释是正确的,可以设置绘图范围。你需要将注释取消掉并根据需要修改 js_box 的数值和地图上划分网格的数量。然后可以在 Rbf 插值之前使用 meshgrid 函数创建网格点坐标,如下所示:
js_box = np.array([min(df['lon']), min(df['lat']), max(df['lon']), max(df['lat'])])
grid_lon = np.linspace(js_box[0], js_box[2], 400)
grid_lat = np.linspace(js_box[1], js_box[3], 400)
olon, olat = np.meshgrid(grid_lon, grid_lat)
然后,在 plot_year_data() 函数中,你需要将数据限制在这个范围内,并且使用 meshgrid 创建的网格点坐标进行插值。根据注释中的提示,你需要在 df 中选取相应的经纬度和数据列,然后使用 Rbf 插值函数创建一个函数对象,在网格点处求解这个函数的值即可,如下所示:
# 在 df 中选取经纬度和数据列
sub_df = df[['lon', 'lat', col]]

# 创建 Rbf 插值函数对象
rbf = Rbf(sub_df['lon'], sub_df['lat'], sub_df[col], function='linear')

# 在网格点处求解插值函数的值
z = rbf(olon, olat)
最后,你需要使用 imshow 或 contourf 函数绘制插值后的数据。例如,可以使用 contourf 函数创建一个填充等值线图:

python
plt.contourf(olon, olat, z)
plt.colorbar()
plt.title(f"年平均{columns_name[col]}")
plt.xlabel("经度")
plt.ylabel("纬度")
plt.show()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-23 23:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表