气象数据与人口数据可视化分析
1. 气象数据可视化
在气象数据的分析中,我们收集了十个城市的气象数据,包括湿度和风力相关信息。分析湿度与城市离海距离的关系时,通过观察图表发现,离海近的城市,最小和最大湿度都相对较大。不过,由于收集的十个数据点太少,难以确定湿度和离海距离之间存在线性或其他可绘制曲线的关系。
风力数据方面,每个城市收集的数据包含风向(风力角度)和风速。风速与风向和一天中的时间相关。若使用经典散点图来展示风力数据,如执行以下代码:
plt.plot(df_ravenna['wind_deg'],df_ravenna['wind_speed'],'ro')
得到的图表信息价值不大。为了更好地展示 360 度范围内的风力分布,我们选择使用极坐标图。具体操作步骤如下:
1. 创建直方图,将 360 度区间划分为八个 45 度的区间:
hist, bins = np.histogram(df_ravenna['wind_deg'],8,[0,360])
print(hist)
print(bins)
运行结果示例:
Out [ ]:
[ 0 5 11 1 0 1 0 0]
Out [ ]:
[ 0. 45. 90. 135. 180. 225. 270. 315. 360.]
-
定义
showRoseWind函数来绘制极坐标图:
def showRoseWind(values,city_name,max_value):
N = 8
theta = np.arange(0.,2 * np.pi, 2 * np.pi / N)
radii = np.array(values)
plt.axes([0.025, 0.025, 0.95, 0.95], polar=True)
colors = [(1-x/max_value, 1-x/max_value, 0.75) for x in radii]
plt.bar(theta +np.pi/8, radii, width=(2*np.pi/N), bottom=0.0, color=colors)
plt.title(city_name,x=0.2, fontsize=20)
- 使用该函数绘制极坐标图:
showRoseWind(hist,'Ravenna',max(hist))
通过这个极坐标图,我们可以直观地看到风向的径向分布。例如,在这个例子中,大部分时间风主要吹向西南/西方向。
我们还可以计算风速的平均分布。定义
RoseWind_Speed
函数来计算 360 度划分为八个区间的平均风速:
def RoseWind_Speed(df_city):
degs = np.arange(45,361,45)
tmp = []
for deg in degs:
tmp.append(df_city[(df_city['wind_deg']>(deg-46)) & (df_city['wind_deg']<deg)]['wind_speed'].mean())
return np.nan_to_num(tmp)
再定义
showRoseWind_Speed
函数来绘制风速分布的极坐标图:
def showRoseWind_Speed(speeds,city_name):
N = 8
theta = np.arange(0,2 * np.pi, 2 * np.pi / N)
radii = np.array(speeds)
plt.axes([0.025, 0.025, 0.95, 0.95], polar=True)
colors = [(1-x/10.0, 1-x/10.0, 0.75) for x in radii]
bars = plt.bar(theta+np.pi/8, radii, width=(2*np.pi/N), bottom=0.0, color=colors)
plt.title(city_name,x=0.2, fontsize=20)
使用示例:
showRoseWind_Speed(RoseWind_Speed(df_ravenna),'Ravenna')
最后,我们可以使用
pandas
库的
to_csv
函数将处理后的数据保存为 CSV 文件,例如:
df_ferrara.to_csv('ferrara.csv')
df_milano.to_csv('milano.csv')
# 其他城市数据保存类似
2. 人口数据可视化
在人口数据的分析中,我们使用美国人口普查局网站(www.census.gov)提供的人口数据进行分析。具体操作步骤如下:
1. 下载数据:访问网站上的数据集链接(www2.census.gov/programs - surveys/popest/datasets/),下载最新的 CSV 文件,这里使用的是
co - est2022 - alldata.csv
。
2. 导入必要的库:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
- 读取数据:
pop2022 = pd.read_csv('co - est2022 - alldata.csv', encoding='latin - 1', dtype={'STATE': 'str', 'COUNTY': 'str'})
- 查看数据结构:
pop2022
数据结构中,
SUMLEV
列表示数据的地理级别,如 40 表示州,50 表示单个县。其他列包含了地区的分层细分信息以及人口估计数据。
为了便于分析,我们提取所需的数据:
1. 提取州级数据:
pop2022_by_state = pop2022[pop2022.SUMLEV == 40]
- 提取关键信息:
states = pop2022_by_state[['STNAME', 'POPESTIMATE2020', 'POPESTIMATE2021', 'POPESTIMATE2022']]
我们可以找出人口最多的五个州:
states.sort_values(['POPESTIMATE2022'], ascending=False)[:5]
接下来,我们使用 JavaScript 的 D3 库来进行数据可视化。D3 是一个强大的 JavaScript 库,用于数据可视化。在 Jupyter Notebook 中使用 D3 库的步骤如下:
1. 导入 D3 库:
%%javascript
require.config({
paths: {
d3: '//cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min'
}
});
- 定义 CSS 样式:
from IPython.display import display, Javascript, HTML
display(HTML("""
<style>
.bar {
fill: steelblue;
}
.bar:hover{
fill: brown;
}
.axis {
font: 10px sans-serif;
}
.axis path,
.axis line {
fill: none;
stroke: #000;
}
.x.axis path {
display: none;
}
</style>
<div id="chart_d3" />
"""))
-
安装并使用
Jinja2库定义动态 JavaScript 代码模板:
import jinja2
myTemplate = jinja2.Template("""
require(["d3"], function(d3){
var data = []
{% for row in data %}
data.push({ 'state': '{{ row[1] }}', 'population': '{{ row[4] }}' });
{% endfor %}
d3.select("#chart_d3 svg").remove()
var margin = {top: 20, right: 20, bottom: 30, left: 40},
width = 800 - margin.left - margin.right,
height = 400 - margin.top - margin.bottom;
var x = d3.scale.ordinal()
.rangeRoundBands([0, width], .25);
var y = d3.scale.linear()
.range([height, 0]);
var xAxis = d3.svg.axis()
.scale(x)
.orient("bottom");
var yAxis = d3.svg.axis()
.scale(y)
.orient("left")
.ticks(10)
.tickFormat(d3.format('.1s'));
var svg = d3.select("#chart_d3").append("svg")
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom)
.append("g")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
x.domain(data.map(function(d) { return d.state; }));
y.domain([0, d3.max(data, function(d) { return d.population; })]);
svg.append("g")
.attr("class", "x axis")
.attr("transform", "translate(0," + height + ")")
.call(xAxis);
svg.append("g")
.attr("class", "y axis")
.call(yAxis)
.append("text")
.attr("transform", "rotate(-90)")
.attr("y", 6)
.attr("dy", ".71em")
.style("text - anchor", "end")
.text("Population");
svg.selectAll(".bar")
.data(data)
.enter().append("rect")
.attr("class", "bar")
.attr("x", function(d) { return x(d.state); })
.attr("width", x.rangeBand())
.attr("y", function(d) { return y(d.population); })
.attr("height", function(d) { return height - y(d.population); });
});
""")
- 渲染模板并显示图表:
display(Javascript(myTemplate.render(data = states.sort_values(['POPESTIMATE2022'], ascending=False)[:10].itertuples())))
为了展示各州人口随时间的变化趋势,我们可以使用聚类条形图。修改 CSS 样式和模板代码,具体如下:
1. 修改 CSS 样式:
display(HTML("""
<style>
.bar2020 {
fill: steelblue;
}
.bar2021 {
fill: red;
}
.bar2022 {
fill: yellow;
}
.axis {
font: 10px sans-serif;
}
.axis path,
.axis line {
fill: none;
stroke: #000;
}
.x.axis path {
display: none;
}
</style>
<div id="chart_d3" />
"""))
- 修改模板代码:
import jinja2
myTemplate = jinja2.Template("""
require(["d3"], function(d3){
var data = []
var data2 = []
var data3 = []
{% for row in data %}
data.push ({ 'state': '{{ row[1] }}', 'population': '{{ row[2] }}' });
data2.push({ 'state': '{{ row[1] }}', 'population': '{{ row[3] }}' });
data3.push({ 'state': '{{ row[1] }}', 'population': '{{ row[4] }}' });
{% endfor %}
d3.select("#chart_d3 svg").remove()
var margin = {top: 20, right: 20, bottom: 30, left: 40},
width = 800 - margin.left - margin.right,
height = 400 - margin.top - margin.bottom;
var x = d3.scale.ordinal()
.rangeRoundBands([0, width], .25);
var y = d3.scale.linear()
.range([height, 0]);
var xAxis = d3.svg.axis()
.scale(x)
.orient("bottom");
var yAxis = d3.svg.axis()
.scale(y)
.orient("left")
.ticks(10)
.tickFormat(d3.format('.1s'));
var svg = d3.select("#chart_d3").append("svg")
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom)
.append("g")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
x.domain(data.map(function(d) { return d.state; }));
y.domain([0, d3.max(data, function(d) { return d.population; })]);
svg.append("g")
.attr("class", "x axis")
.attr("transform", "translate(0," + height + ")")
.call(xAxis);
svg.append("g")
.attr("class", "y axis")
.call(yAxis)
.append("text")
.attr("transform", "rotate(-90)")
.attr("y", 6)
.attr("dy", ".71em")
.style("text - anchor", "end")
.text("Population");
svg.selectAll(".bar2020")
.data(data)
.enter().append("rect")
.attr("class", "bar2020")
.attr("x", function(d) { return x(d.state); })
.attr("width", x.rangeBand()/4)
.attr("y", function(d) { return y(d.population); })
.attr("height", function(d) { return height - y(d.population); });
svg.selectAll(".bar2021")
.data(data2)
.enter().append("rect")
.attr("class", "bar2021")
.attr("x", function(d) { return (x(d.state)+x.rangeBand()/3); })
.attr("width", x.rangeBand()/3)
.attr("y", function(d) { return y(d.population); })
.attr("height", function(d) { return height - y(d.population); });
svg.selectAll(".bar2022")
.data(data3)
.enter().append("rect")
.attr("class", "bar2022")
.attr("x", function(d) { return (x(d.state)+2*x.rangeBand()/3); })
.attr("width", x.rangeBand()/3)
.attr("y", function(d) { return y(d.population); })
.attr("height", function(d) { return height - y(d.population); });
});
""")
- 重新渲染模板并显示图表:
# 重新渲染代码,根据修改后的数据和模板
这种聚类条形图能更清晰地展示各州在不同年份的人口变化趋势。
总结
通过以上对气象数据和人口数据的分析与可视化,我们可以看到数据可视化在数据分析中的重要性。不同类型的数据需要选择合适的可视化方法,才能更直观地呈现数据背后的信息。在气象数据中,极坐标图能很好地展示风力的分布;在人口数据中,使用 D3 库可以创建出更复杂和强大的可视化图表,帮助我们更好地理解数据。
流程图
graph LR
A[气象数据处理] --> B[湿度与离海距离分析]
A --> C[风力数据处理]
C --> D[散点图展示]
C --> E[极坐标图展示]
E --> F[风向分布分析]
E --> G[风速分布分析]
G --> H[数据保存为 CSV]
I[人口数据处理] --> J[数据下载]
J --> K[数据读取]
K --> L[数据筛选]
L --> M[找出人口最多州]
M --> N[D3 库可视化]
N --> O[条形图展示]
N --> P[聚类条形图展示]
表格
| 数据类型 | 可视化方法 | 代码关键步骤 |
|---|---|---|
| 气象数据(风力) | 极坐标图 |
1. 创建直方图
2. 定义
showRoseWind
函数
3. 调用函数绘制图表 |
| 人口数据 | 条形图、聚类条形图 |
1. 导入 D3 库
2. 定义 CSS 样式 3. 使用
Jinja2
定义模板
4. 渲染模板显示图表 |
气象数据与人口数据可视化分析
3. 气象数据与人口数据可视化总结
气象数据和人口数据的可视化分析为我们提供了不同领域的洞察。以下是对两种数据可视化过程的总结:
气象数据可视化总结
- 数据收集 :收集了十个城市的气象数据,涵盖湿度、风向和风速等信息。
- 湿度分析 :观察到离海近的城市湿度较大,但因数据点少难以确定与离海距离的关系。
-
风力可视化
:散点图不适合展示风力数据,极坐标图能更好地呈现风向和风速的分布。
-
风向极坐标图
:通过
showRoseWind函数绘制,直观展示风向的径向分布。 -
风速极坐标图
:使用
RoseWind_Speed和showRoseWind_Speed函数计算并绘制风速分布。
-
风向极坐标图
:通过
-
数据保存
:使用
pandas的to_csv函数将处理后的数据保存为 CSV 文件。
人口数据可视化总结
- 数据获取 :从美国人口普查局网站下载 CSV 数据。
- 数据处理 :提取州级数据和关键信息,找出人口最多的五个州。
-
D3 库可视化
:在 Jupyter Notebook 中使用 D3 库创建条形图和聚类条形图。
- 条形图 :展示人口最多的州的人口数量。
- 聚类条形图 :展示各州在不同年份的人口变化趋势。
4. 可视化效果对比
为了更清晰地比较不同可视化方法的效果,我们可以将气象数据和人口数据的可视化结果进行对比。
| 数据类型 | 可视化方法 | 优点 | 缺点 |
|---|---|---|---|
| 气象数据(风力) | 散点图 | 简单直观展示数据点 | 难以展示 360 度分布 |
| 气象数据(风力) | 极坐标图 | 清晰展示风向和风速分布 | 相对复杂,需特定函数绘制 |
| 人口数据 | 条形图 | 直观展示人口数量对比 | 难以展示多年份数据变化 |
| 人口数据 | 聚类条形图 | 清晰展示各州多年份人口变化趋势 | 图表较复杂,需调整样式 |
5. 实际应用与拓展
可视化分析在实际应用中有广泛的用途,以下是一些可能的应用场景和拓展方向:
气象数据应用
- 城市规划 :根据风向和风速分布,合理规划城市的工业布局和居民区,减少空气污染对居民的影响。
- 农业生产 :了解不同地区的湿度和风力情况,为农业灌溉和作物种植提供参考。
- 能源开发 :分析风力资源的分布,确定风力发电场的最佳选址。
人口数据应用
- 政策制定 :根据各州人口变化趋势,制定相应的教育、医疗和就业政策。
- 市场调研 :了解不同地区的人口规模和增长趋势,为企业的市场拓展提供依据。
- 资源分配 :根据人口分布情况,合理分配公共资源,提高资源利用效率。
拓展方向
- 多数据融合 :将气象数据和人口数据结合起来,分析气象因素对人口分布和迁移的影响。
- 实时数据可视化 :使用实时气象和人口数据,实现动态可视化,及时反映数据变化。
- 交互式可视化 :增加用户交互功能,让用户可以自由选择数据和可视化方式,深入探索数据。
6. 代码优化与注意事项
在进行数据可视化时,我们还需要注意一些代码优化和使用的注意事项。
气象数据代码优化
- 函数复用 :将一些通用的函数封装起来,提高代码的复用性。例如,可以将创建极坐标图的代码封装成一个通用函数,方便在不同城市的数据上使用。
def create_polar_chart(values, city_name, max_value, title):
N = 8
theta = np.arange(0., 2 * np.pi, 2 * np.pi / N)
radii = np.array(values)
plt.axes([0.025, 0.025, 0.95, 0.95], polar=True)
colors = [(1 - x / max_value, 1 - x / max_value, 0.75) for x in radii]
plt.bar(theta + np.pi / 8, radii, width=(2 * np.pi / N), bottom=0.0, color=colors)
plt.title(title, x=0.2, fontsize=20)
- 数据处理优化 :在处理大量气象数据时,可以使用更高效的数据结构和算法,减少计算时间。
人口数据代码优化
- 模板管理 :将 D3 库的模板代码单独保存为文件,方便管理和修改。
- 数据加载优化 :使用异步加载数据的方式,提高页面的响应速度。
注意事项
- 数据质量 :确保数据的准确性和完整性,避免因数据错误导致的可视化结果偏差。
- 库版本 :注意使用的 Python 库和 JavaScript 库的版本兼容性,避免出现代码运行错误。
- 性能优化 :在处理大规模数据时,注意代码的性能优化,避免出现卡顿现象。
流程图
graph LR
A[气象数据应用拓展] --> B[城市规划]
A --> C[农业生产]
A --> D[能源开发]
E[人口数据应用拓展] --> F[政策制定]
E --> G[市场调研]
E --> H[资源分配]
I[数据可视化拓展] --> J[多数据融合]
I --> K[实时数据可视化]
I --> L[交互式可视化]
表格
| 优化方向 | 气象数据 | 人口数据 |
|---|---|---|
| 函数复用 | 创建通用极坐标图函数 | 无 |
| 数据处理优化 | 使用高效数据结构和算法 | 无 |
| 模板管理 | 无 | 模板代码单独保存 |
| 数据加载优化 | 无 | 异步加载数据 |
通过以上的分析和总结,我们可以看到数据可视化在气象和人口领域的重要性和应用价值。合理选择可视化方法和优化代码,可以帮助我们更好地理解数据,做出更明智的决策。
超级会员免费看

被折叠的 条评论
为什么被折叠?



