fawnlove 发表于 2023-4-6 15:30:13

python 出图遇到问题

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

#js_box=np.array()
#grid_lon = np.linspace(js_box,js_box,400)#设置网格经度
#grid_lat = np.linspace(js_box,js_box,400)#设置网格经度
#filename=r'D:\NRD\sxh'#数据文件地址
#df=pd.read_csv(filename)#读取文件
#lons=df['lon']#读取站点经度
#lats=df['lat']#读取站点纬度
#extent=),int(js_box),int(js_box),int(js_box)]#定义绘图范围
#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").mean()
      plt.plot(yearly_data.index, yearly_data.values)
      # 设置图表标题和轴标签
      plt.title(f"年平均{columns_name}")
      plt.xlabel("年份")
      plt.ylabel(columns_name)

      # 显示图表
      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['lat']), max(df['lon']), max(df['lat'])])
grid_lon = np.linspace(js_box, js_box, 400)
grid_lat = np.linspace(js_box, js_box, 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, function='linear')

# 在网格点处求解插值函数的值
z = rbf(olon, olat)

最后,你需要使用 imshow 或 contourf 函数绘制插值后的数据。例如,可以使用 contourf 函数创建一个填充等值线图:

python
plt.contourf(olon, olat, z)
plt.colorbar()
plt.title(f"年平均{columns_name}")
plt.xlabel("经度")
plt.ylabel("纬度")
plt.show()
页: [1]
查看完整版本: python 出图遇到问题