地图、华夫饼、词云和 Seaborn

以下是整理后的内容,方便查阅:


地图、华夫饼、词云和 Seaborn

1. Folium(地图)

功能 描述 语法 示例
地图 创建一个具有指定中心坐标和缩放级别的地图对象 folium.Map(location=[lat, lon], zoom_start=n) canada = folium.Map(location=[56.130, -106.35], zoom_start=4)
标记 向地图添加自定义图标、弹出窗口和图块的标记 folium.Marker(location=[lat, lon], popup='Popup', tiles='Stamen Toner').add_to(map) folium.Marker(location=[56.130, -106.35], tooltip='Marker', tiles='Stamen Toner').add_to(world_map)
圆形 向地图添加具有指定半径、颜色和填充不透明度的圆形 folium.features.CircleMarker(location=[lat, lon], radius=n, color='red', fill_opacity=n).add_to(map) folium.features.CircleMarker(location=[56.130, -106.35], radius=1000, color='red', fill_opacity=0.5).add_to(world_map)
分级图 基于 GeoJSON 文件和数据列创建分级图 folium.Choropleth(geo_data='path/to/geojson_file', data=df, columns=['region', 'value_column'], key_on='feature.properties.id', fill_color='YlGnBu', fill_opacity=0.7, line_opacity=0.2, legend_name='Legend').add_to(map) world_map.choropleth(geo_data=world_geo, data=df_can, columns=['Country', 'Total'], key_on='feature.properties.name', fill_color='YlOrRd', fill_opacity=0.7, line_opacity=0.2, legend_name='移民到加拿大')

2. PyWaffle(华夫饼图)

功能 描述 语法 示例
华夫饼 基于值和类别创建华夫饼图 plt.figure(FigureClass=Waffle, rows=n, columns=n, values=values) plt.figure(FigureClass=Waffle, rows=20, columns=30, values=df_dsn['Total'], cmap_name='tab20', legend={'labels': label, 'loc': 'lower left', 'bbox_to_anchor':(0,-0.1), 'ncol': 3})
图例 向华夫饼图添加图例 waffle_chart.legend(loc='upper left', bbox_to_anchor=(1, 1)) -
标题 向华夫饼图添加标题 waffle_chart.set_title('华夫饼图标题') -
标签 向华夫饼图添加标签 waffle_chart.set_labels(['标签 1', '标签 2', ...]) -

3. 词云(WordCloud)

功能 描述 语法 示例
词云 基于文本数据创建词云对象 wordcloud = WordCloud().generate(text_data) alice_wc = WordCloud(background_color='white', max_words=2000, mask=alice_mask, stopwords=stopwords) alice_wc.generate(alice_novel) plt.imshow(alice_wc, interpolation='bilinear')
生成 基于文本数据生成词云 wordcloud.generate(text_data) -
显示 使用 Matplotlib 显示词云 plt.imshow(wordcloud, interpolation='bilinear') -
选项 设置字体、颜色、掩膜和停用词 wordcloud = WordCloud(font_path='path/to/font_file', background_color='white', colormap='Blues', mask=mask_image, stopwords=stopwords).generate(text_data) -

4. Seaborn(数据可视化)

功能 描述 语法 示例
条形图 可视化分类变量与数值变量的关系 sns.barplot(x='x_variable', y='y_variable', data=dataframe) sns.barplot(x='Continent', y='Total', data=df_can1)
计数图 显示分类变量中每个类别的频率 sns.countplot(x='category', data=dataframe) sns.countplot(x='Continent', data=df_can)
回归图 带线性回归线的散点图 sns.regplot(x='x_variable', y='y_variable', data=dataframe) sns.regplot(x='year', y='total', data=df_tot)

使用 Python 进行数据可视化

使用 Python 进行数据可视化

使用 Pandas 进行 Matplotlib 绘图

图表类型 描述 Pandas 函数 示例
折线图 显示随时间变化的趋势和变化 DataFrame.plot.line()DataFrame.plot(kind='line') df.plot(x='year', y='sales', kind='line')
面积图 显示数据系列之间的关系,以填充区域呈现 DataFrame.plot.area()DataFrame.plot(kind='area') df.plot(kind='area')
直方图 显示数据在各个区间(箱)内的频数分布 Series.plot.hist()Series.plot(kind='hist', bins=n) s.plot(kind='hist', bins=10)
条形图 通过矩形条形显示数据 DataFrame.plot.bar()DataFrame.plot(kind='bar') df.plot(kind='bar')
饼图 以圆形分片显示数据比例 Series.plot.pie()DataFrame.plot.pie(y, labels) df.plot(x='Category', y='Percentage', kind='pie')
箱型图 展示数据的分布及关键统计指标 DataFrame.plot.box()DataFrame.plot(kind='box') df_can.plot(kind='box')
散点图 通过笛卡尔坐标系展示两个变量的关系 DataFrame.plot.scatter()DataFrame.plot(x, y, kind='scatter') df.plot(x='Height', y='Weight', kind='scatter')

直接使用 Matplotlib 进行绘图

绘图类型 描述 Matplotlib 函数 示例
折线图 显示趋势和随时间变化的情况 plt.plot() plt.plot(x, y, color='red', linewidth=2)
区域图 显示填充区域的变化趋势 plt.fill_between() plt.fill_between(x, y1, y2, color='blue', alpha=0.5)
直方图 显示数据的频数分布 plt.hist() plt.hist(data, bins=10, color='orange', edgecolor='black')
条形图 通过矩形条展示数据 plt.bar() plt.bar(x, height, color='green', width=0.5)
饼图 显示数据的比例或百分比 plt.pie() plt.pie(sizes, labels=labels, colors=colors, explode=explode)
箱型图 显示数据的分布及统计特征 plt.boxplot() plt.boxplot(data, notch=True)
散点图 通过点显示两个变量之间的关系 plt.scatter() plt.scatter(x, y, color='purple', marker='o', s=50)
子图 在一个图形中创建多个子图 plt.subplots() fig, axes = plt.subplots(nrows=2, ncols=2)
自定义 自定义绘图(标题、标签、图例、网格) plt.title() plt.xlabel() plt.ylabel() plt.legend() plt.grid() plt.title('标题') plt.xlabel('X 轴') plt.ylabel('Y 轴') plt.legend() plt.grid(True)

这样整理后,内容更清晰,查找更方便!🚀

Matplotlib 子图(Subplots)解析

Matplotlib 子图(Subplots)解析

子图(Subplots)可以帮助我们在 同一个画布(figure) 上绘制多个不同的图表,方便进行 数据对比展示多个视角 的数据。


1. 什么是 figuresubplot

  • figure:整个 画布(canvas),包含一个或多个子图。
  • subplot:画布上的 单个子图,可以包含不同类型的图表。

在 Matplotlib 中,我们可以使用 plt.subplots() 来创建多个子图:

1
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(12, 6))
  • nrows=1, ncols=2:表示 创建 1 行 2 列的子图(即两个并排的图)。
  • figsize=(12, 6):设置 整体画布大小

2. 子图示例

我们以 中国(China)和印度(India)的移民数据 为例,绘制:

  1. 箱线图(Boxplot)
  2. 折线图(Line plot)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import matplotlib.pyplot as plt

# 创建画布,1 行 2 列的子图
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(12, 6))

# 绘制箱线图(左侧子图)
df[['China', 'India']].plot(kind='box', ax=axes[0], color='blue')
axes[0].set_title('Box plot of China & India Immigration')

# 绘制折线图(右侧子图)
df[['China', 'India']].plot(kind='line', ax=axes[1])
axes[1].set_title('Line plot of China & India Immigration')

# 调整布局,使图表不重叠
plt.tight_layout()

# 显示图表
plt.show()

3. 代码解析

(1) 创建 1 行 2 列的子图

1
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(12, 6))
  • nrows=1, ncols=2:创建 一行两列 的子图布局。
  • figsize=(12, 6):设置 画布大小

(2) 绘制箱线图

1
2
df[['China', 'India']].plot(kind='box', ax=axes[0], color='blue')
axes[0].set_title('Box plot of China & India Immigration')
  • ax=axes[0]:指定绘制到 第 1 个子图(左侧)
  • set_title():设置 子图标题

(3) 绘制折线图

1
2
df[['China', 'India']].plot(kind='line', ax=axes[1])
axes[1].set_title('Line plot of China & India Immigration')
  • ax=axes[1]:指定绘制到 第 2 个子图(右侧)

(4) 调整布局

1
plt.tight_layout()
  • 这个函数 自动调整子图的间距,避免重叠。

(5) 显示图表

1
plt.show()

4. 结果

左侧子图(箱线图):显示中国和印度移民数量的分布情况。
右侧子图(折线图):显示移民数量的变化趋势。
整体布局清晰、易读,适用于数据对比


5. 其他子图布局

除了 1x2 的布局,我们还可以使用其他布局:

(1) 2x2 子图

1
fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(10, 8))

这将创建一个 2 行 2 列的网格布局,适合显示 4 个图。

(2) 不规则布局(GridSpec)

如果想要 不同大小的子图,可以用 GridSpec

1
2
3
4
5
6
7
8
import matplotlib.gridspec as gridspec

fig = plt.figure(figsize=(10, 8))
gs = gridspec.GridSpec(2, 2, height_ratios=[2, 1])

ax1 = plt.subplot(gs[0, :]) # 第 1 行,占满 2 列
ax2 = plt.subplot(gs[1, 0]) # 第 2 行,左侧
ax3 = plt.subplot(gs[1, 1]) # 第 2 行,右侧
  • 上方大图,下方两张小图

总结

  • plt.subplots() 可以创建多个子图,便于 数据对比
  • ax=axes[i] 指定不同的子图位置。
  • plt.tight_layout() 避免子图重叠。
  • GridSpec 适用于 不规则子图布局

这样,我们可以 高效可视化 数据! 🎉

Pandas所有plot的kind样式

每种 kind 类型的 plot() 方法的示例代码,每个示例都展示了一种不同的绘图方式。


1. bar - 垂直柱状图

1
2
3
4
5
6
7
8
9
10
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

data = pd.DataFrame({'Category': ['A', 'B', 'C'], 'Values': [10, 20, 15]})
data.set_index('Category', inplace=True)

data.plot(kind='bar', color='skyblue')
plt.title("Bar Plot")
plt.show()

效果:显示 A、B、C 三个类别的值,以垂直柱状图呈现。


2. barh - 水平柱状图

1
2
3
data.plot(kind='barh', color='green')
plt.title("Horizontal Bar Plot")
plt.show()

效果:与 bar 类似,但方向变为水平。


3. hist - 直方图

1
2
3
4
data_hist = pd.DataFrame({'Values': np.random.randn(1000)})  # 生成 1000 个随机数
data_hist.plot(kind='hist', bins=30, color='purple', alpha=0.7)
plt.title("Histogram")
plt.show()

效果:展示数据分布情况,通常用于查看数据集中值的分布模式。


4. box - 箱型图

1
2
3
4
data_box = pd.DataFrame({'A': np.random.randn(50), 'B': np.random.randn(50) + 2})
data_box.plot(kind='box')
plt.title("Box Plot")
plt.show()

效果:展示数据的四分位数、异常值和中位数情况。


5. kde(或 density)- 核密度估计图

1
2
3
4
data_kde = pd.DataFrame({'Values': np.random.randn(1000)})
data_kde.plot(kind='kde', color='red')
plt.title("KDE Plot")
plt.show()

效果:显示数据的概率密度,适用于观察数据的分布趋势。


6. area - 面积图

1
2
3
4
data_area = pd.DataFrame({'A': np.random.rand(10), 'B': np.random.rand(10)}, index=range(1, 11))
data_area.plot(kind='area', alpha=0.5)
plt.title("Area Plot")
plt.show()

效果:类似折线图,但填充了颜色,适合展示不同系列之间的对比。


7. pie - 饼图

1
2
3
4
5
data_pie = pd.Series([10, 20, 30], index=['A', 'B', 'C'])
data_pie.plot(kind='pie', autopct='%1.1f%%', colors=['blue', 'orange', 'green'])
plt.title("Pie Chart")
plt.ylabel("") # 隐藏默认的 y 轴标签
plt.show()

效果:显示各部分占比,适用于展示比例关系。


8. scatter - 散点图

1
2
3
4
data_scatter = pd.DataFrame({'X': np.random.rand(50), 'Y': np.random.rand(50)})
data_scatter.plot(kind='scatter', x='X', y='Y', color='blue')
plt.title("Scatter Plot")
plt.show()

效果:用于展示两个变量之间的关系,常见于回归分析。


9. hexbin - 六边形箱图

1
2
3
4
data_hexbin = pd.DataFrame({'X': np.random.randn(1000), 'Y': np.random.randn(1000)})
data_hexbin.plot(kind='hexbin', x='X', y='Y', gridsize=25, cmap='Blues')
plt.title("Hexbin Plot")
plt.show()

效果:适用于大数据量散点分布,通过颜色深浅显示点的密度。


这些示例涵盖了 pandas 支持的各种常见图表类型,具体选择哪种取决于数据特点和分析需求。

Matplotlib所有可用样式

Matplotlib 提供的所有可用样式(style)及其特点介绍:


1. 经典风格

  • classic:Matplotlib 旧版的默认风格,颜色较淡,线条较细,适合习惯早期 Matplotlib 风格的用户。
  • _classic_test_patch:一个用于测试的经典风格,与 classic 类似,主要用于 Matplotlib 内部测试。

2. 现代流行风格

  • ggplot:模仿 R 语言的 ggplot2 主题,使用柔和的颜色,带有网格线,适用于数据分析和统计图表。
  • fivethirtyeight:模仿 FiveThirtyEight 网站的数据可视化风格,线条较粗,颜色鲜明,背景为浅灰色,适合数据新闻或高对比度展示。
  • bmh(Bayesian Methods for Hackers):
    • 适合统计分析,背景较浅,网格线清晰,线条较粗。
    • 适用于数据科学、统计建模和机器学习可视化。
  • fast
    • 牺牲部分视觉效果,提升渲染速度,适用于大规模数据集的快速可视化。

3. 深色主题

  • dark_background
    • 黑色背景,适合夜间模式或需要高对比度的可视化展示。
    • 适用于投影仪演示或屏幕展示。
  • seaborn-v0_8-dark
    • Seaborn 主题,深色背景,适合夜间模式的可视化。
  • seaborn-v0_8-dark-palette
    • 深色背景,搭配 Seaborn 颜色方案,颜色较丰富,适合数据展示。
  • seaborn-v0_8-darkgrid
    • 深色背景 + 网格线,适用于数据趋势分析。

4. 浅色主题

  • seaborn-v0_8-white
    • 纯白背景,无网格线,适合简洁风格。
  • seaborn-v0_8-whitegrid
    • 白色背景,带网格线,适合统计数据可视化。

5. 论文、报告风格

  • seaborn-v0_8-paper
    • 适用于学术论文格式,配色简洁,适合黑白打印。
  • seaborn-v0_8-notebook
    • 适用于 Jupyter Notebook 环境,可读性强。
  • seaborn-v0_8-poster
    • 适用于海报或大屏幕展示,字号较大,线条较粗。
  • seaborn-v0_8-talk
    • 适用于演讲或 PPT 展示,增强了对比度和字体大小。

6. 适合出版或色盲友好的风格

  • grayscale
    • 所有颜色变成灰阶,适合黑白打印或研究色彩对比。
  • tableau-colorblind10
    • 适用于色盲用户的 Tableau 颜色方案,提高可读性。

7. Seaborn 主题系列

这些风格都属于 Seaborn 主题,可用于增强 Matplotlib 的可视化美观性:

  • seaborn-v0_8(默认 Seaborn 主题)。
  • seaborn-v0_8-bright(明亮色彩)。
  • seaborn-v0_8-colorblind(色盲友好)。
  • seaborn-v0_8-deep(更深的颜色)。
  • seaborn-v0_8-muted(柔和色调)。
  • seaborn-v0_8-pastel(淡色)。
  • seaborn-v0_8-ticks(适用于带刻度的图表)。

示例:对比不同风格

你可以使用以下代码来快速查看不同风格的效果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 10, 100)
y = np.sin(x)

styles = ['ggplot', 'fivethirtyeight', 'seaborn-v0_8-darkgrid', 'dark_background']

for style in styles:
plt.style.use(style)
plt.figure()
plt.plot(x, y, label=f"Style: {style}")
plt.legend()
plt.title(f"Matplotlib Style: {style}")
plt.show()