对科研人员来说,数据可视化是将复杂数据以易于理解的方式表达的重要工具。在Python中,有许多库和工具可用于数据绘图,但如果缺乏专业知识和编程经验,想要绘制出有效且视觉上令人满意的图表具有一定的挑战性。ChatGPT的出现,为编程经验不足的科研工作者们提供了良好的契机。ChatGPT 基于强大的自然语言处理技术,能够理解不同用户的需求,并给出相关的回答和建议。我们只需简要描述想要得到的图的类型,ChatGPT会生成相应的代码,即可实现在Python中绘图。
本期我们主要利用ChatGPT和Python来绘制降雨质心气泡地图。
(2)降雨质心(可理解为场次降雨某个时刻的降雨中心)坐标,对应降雨时刻与雨强大小,具体如下表所示:首先利用降雨质心数据绘制气泡图:
提问:
“用python帮我绘制高级美观的气泡地图,在pycharm里运行显示,数据路径为C:\Users\86136\Desktop\Data.xlsx,数据格式为上文提到表格形式。”
回答:
“为了绘制高级美观的泡泡地图,我们可以使用Python中的一些库来实现,包括Pandas、Matplotlib和Seaborn,完整代码如下:”
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
data = pd.read_excel('C:\\Users\\86136\\Desktop\\Data.xlsx')
sns.scatterplot(x='x', y='y', data=data, hue='rainfall', size='rainfall', sizes=(50, 500))
plt.show()
绘制结果如下:
提问:
“帮我优化代码,time值表示气泡图的颜色深浅,rainfall值表示气泡图大小。”
回答:
“在这个问题中,我们可以根据时间值为气泡地图设置颜色深浅,并将rainfall值用于确定泡泡图的大小。”
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
data = pd.read_excel('C:\\Users\\86136\\Desktop\\Data.xlsx')
sns.scatterplot(x='x', y='y', data=data, hue='time', size='rainfall', sizes=(50, 500), palette='coolwarm')
plt.show()
绘制结果如下:
继续对代码进行优化并添加研究区域:
提问:
“帮我优化代码,要求保持原有的气泡图大小颜色,然后绘制在我提供的shp文件范围中。”
回答:
“为了保持原有的气泡图大小和颜色,并将它们绘制在提供的shp文件范围内,我们可以使用geopandas库。首先,我们需要导入所需的库和数据。”
import pandas as pd
import geopandas as gpd
from shapely.geometry import Point
import matplotlib.pyplot as plt
import seaborn as sns
data = pd.read_excel('C:\\Users\\86136\\Desktop\\Data.xlsx')
shp_path = 'C:\\Users\\86136\\Desktop\\shp\\北京市区县.shp'
map_df = gpd.read_file(shp_path)
geometry = [Point(xy) for xy in zip(data['x'], data['y'])]
geo_data = gpd.GeoDataFrame(data, crs=map_df.crs, geometry=geometry)
merged = gpd.sjoin(map_df, geo_data, op='contains')
fig, ax = plt.subplots(1, figsize=(10, 6))
sns.scatterplot(x='x', y='y', data=data, hue='time', size='rainfall', sizes=(50, 500), palette='coolwarm', alpha=0.7, legend=False, ax=ax)
merged.plot(facecolor='none', edgecolor='black', linewidth=0.5, ax=ax)
plt.show()
绘制结果如下:
从上步绘制完成的图中可以发现,在生成新代码的时候,图例丢失,继续优化代码:
提问
:
“继续优化代码,要求按之前的要求添加图例。”
回答:
“为了按照之前的要求绘制气泡图,并在提供的shp文件范围内添加图例并完全显示,我们可以使用geopandas和Seaborn库。”import pandas as pd
import geopandas as gpd
from shapely.geometry import Point
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['font.family'] = 'Times New Roman'
data = pd.read_excel('C:\\Users\\86136\\Desktop\\Data.xlsx')
shp_path = 'C:\\Users\\86136\\Desktop\\shp\\北京市区县.shp'
map_df = gpd.read_file(shp_path)
geometry = [Point(xy) for xy in zip(data['x'], data['y'])]
geo_data = gpd.GeoDataFrame(data, crs=map_df.crs, geometry=geometry)
merged = gpd.sjoin(map_df, geo_data, op='contains')
fig, ax = plt.subplots(1, figsize=(96, 87))
sns.scatterplot(x='x', y='y', data=data, hue='Time', size='Rainfall', sizes=(50, 500), palette='coolwarm', alpha=0.7, legend='brief', ax=ax)
merged.plot(facecolor='none', edgecolor='black', linewidth=0.5, ax=ax)
ax.set_xlabel('Longitude', fontsize=14)
ax.set_ylabel('Latitude', fontsize=14)
legend = ax.legend(loc='upper left', prop={"family": "Times New Roman"})
ax.legend(handlelength=3, handleheight=1)
ax.legend(fontsize=13.6)
ax.get_legend().set_bbox_to_anchor((0.25, 1))
plt.show()
绘制结果如下:
好啦,经过反复调试,最终得到了我们想要的降雨质心气泡地图~下面是我们利用ChatGPT和Python实现的一些其他类型的图,供大家参考:
1.在表述准确的前提下使用英文提问效果要好于中文提问;在提问最开始限制使用的编程语言和使用的具体绘图库会精确代码的方向;出错报错后可以通过继续向ChatGPT追问得到解决。
2.一般的提问格式可以按照:前提假设(使用何种编程语言)---数据样本(提供给ChatGPT的数据样本格式)---需求(需要何种类型的绘图)。
3.对于无代码基础者,建议遵循以下原则:对绘图所需数据进行充分预处理,便于ChatGPT识别;分多次提问,第一步识别数据,第二步绘制所需基本图形,第三步对基本图形进行调整,以减少报错及报错后的调试难度;有逻辑的表述自己的意图,比如说清楚具体需要绘制什么类型的图表。
资源分享:
1.常用绘图类型
使用科研绘图的前提是了解常见图表的种类以及相应的用途,以下几个网站可帮助大家查询常用绘图类型:
The R Graph Gallery 网址 :
https://r-graph-gallery.com/index.html
Data to Viz 网址 :
https://www.data-to-viz.com/
2.ChatGPT 常用镜像网站汇总
国内注册ChatGPT流程较为繁琐,目前有很多开源项目基于ChatGPT开发的镜像网站供大家学习参考:
https://github.com/LiLittleCat/awesome-free-chatgpt
3.Pycharm(专业版)ChatGPT插件
目前,2020年以后发布的专业版Pycharm已内置多款ChatGPT插件,无需科学上网、注册即可使用,安装教程如下:
https://blog.csdn.net/weixin_57664381/article/details/129665074
一图胜千言!水文图绘改版后致力于分享水文相关的精美图表,为读者提供作图思路和经验,帮助大家制作更漂亮丰富的图表。同时欢迎留言咨询绘图难点,我们会针对性地分享相关绘制经验。另外也期待读者踊跃来稿,分享更好的构图思维和技巧,稿件可发送至邮箱hydro90@126.com, 或者联系微信17339888901投稿。