鱼C论坛

 找回密码
 立即注册
查看: 49|回复: 16

matplotlib可视化分析

[复制链接]
发表于 昨天 18:33 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 Terence888 于 2024-10-17 18:37 编辑
# specifies the parameters of our graphs
fig = plt.figure(figsize=(18,6), dpi=1600) 
alpha=alpha_scatterplot = 0.2 
alpha_bar_chart = 0.55

# lets us plot many diffrent shaped graphs together 
ax1 = plt.subplot2grid((2,3),(0,0))
# plots a bar graph of those who surived vs those who did not.               
df.Survived.value_counts().plot(kind='bar', alpha=alpha_bar_chart)
# this nicely sets the margins in matplotlib to deal with a recent bug 1.3.1
ax1.set_xlim(-1, 2)
# puts a title on our graph
plt.title("Distribution of Survival, (1 = Survived)")    

plt.subplot2grid((2,3),(0,1))
plt.scatter(df.Survived, df.Age, alpha=alpha_scatterplot)
# sets the y axis lable
plt.ylabel("Age")
# formats the grid line style of our graphs                          
plt.grid(b=True, which='major', axis='y')  
plt.title("Survival by Age,  (1 = Survived)")

ax3 = plt.subplot2grid((2,3),(0,2))
df.Pclass.value_counts().plot(kind="barh", alpha=alpha_bar_chart)
ax3.set_ylim(-1, len(df.Pclass.value_counts()))
plt.title("Class Distribution")

plt.subplot2grid((2,3),(1,0), colspan=2)
# plots a kernel density estimate of the subset of the 1st class passangers's age
df.Age[df.Pclass == 1].plot(kind='kde')    
df.Age[df.Pclass == 2].plot(kind='kde')
df.Age[df.Pclass == 3].plot(kind='kde')
 # plots an axis lable
plt.xlabel("Age")    
plt.title("Age Distribution within classes")
# sets our legend for our graph.
plt.legend(('1st Class', '2nd Class','3rd Class'),loc='best') 

ax5 = plt.subplot2grid((2,3),(1,2))
df.Embarked.value_counts().plot(kind='bar', alpha=alpha_bar_chart)
ax5.set_xlim(-1, len(df.Embarked.value_counts()))
# specifies the parameters of our graphs
plt.title("Passengers per boarding location")
其中,
ax5.set_xlim(-1, len(df.Embarked.value_counts()))
表示什么意思
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 昨天 18:37 | 显示全部楼层
fig = plt.figure(figsize=(18,6), dpi=1600) 
alpha=alpha_scatterplot = 0.2 
alpha_bar_chart = 0.55
各参数表示什么意思
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 昨天 18:37 | 显示全部楼层
`ax5.set_xlim(-1, len(df.Embarked.value_counts()))` 设置了图表x轴的显示范围。

具体来说:

- `set_xlim` 是一个方法,用于设置x轴的起始和结束位置。
- `-1` 是x轴的起始位置,这里设置为-1是为了在左侧留出一些空白边距,避免条形图紧贴图表边缘。
- `len(df.Embarked.value_counts())` 计算了`df.Embarked.value_counts()` 的长度,表示有多少不同的登船地点。这作为x轴的结束位置,确保所有分类条目都能被完全显示在图表中。

这个语句的目的就是调整x轴的范围,以便图形的布局看起来更整齐。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 昨天 19:03 | 显示全部楼层
FishC 发表于 2024-10-17 18:37
`ax5.set_xlim(-1, len(df.Embarked.value_counts()))` 设置了图表x轴的显示范围。

具体来说:
module 'matplotlib.pyplot' has no attribute 'set_xlim'
报错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 昨天 19:05 | 显示全部楼层
Terence888 发表于 2024-10-17 19:03
module 'matplotlib.pyplot' has no attribute 'set_x ...


报这个错是因为 `set_xlim` 是 Axes 对象的方法,而不是 `matplotlib.pyplot` 中的方法。要正确使用 `set_xlim`,你需要通过 Axes 对象来调用它。如图中的 `ax5.set_xlim`。

确保已经创建了Axes对象(如 `ax1`, `ax3`, `ax5`),然后对这些对象调用 `set_xlim`:

例如:
fig, ax = plt.subplots()
ax.set_xlim(left, right)  # 调用 set_xlim 方法设置 x 轴范围

在你的代码中:
ax1.set_xlim(-1, 2)
ax3.set_ylim(-1, len(df.Pclass.value_counts()))
ax5.set_xlim(-1, len(df.Embarked.value_counts()))

确保 `ax1`, `ax3` 和 `ax5` 是通过 `plt.subplot2grid` 正确返回的 Axes 对象。这样,`set_xlim` 调用就应该不会出错。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 20:50 | 显示全部楼层
FishC 发表于 2024-10-17 19:05
报这个错是因为 `set_xlim` 是 Axes 对象的方法,而不是 `matplotlib.pyplot` 中的方法。要正确使用 `s ...
fig = plt.figure(figsize=(18,6), dpi=1600) 
alpha=alpha_scatterplot = 0.2 
alpha_bar_chart = 0.55
这三个参数表示什么意思
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 昨天 20:50 | 显示全部楼层
Terence888 发表于 2024-10-17 20:50
fig = plt.figure(figsize=(18,6), dpi=1600)
alpha ...


`fig = plt.figure(figsize=(18,6), dpi=1600)` 中的参数分别表示:

1. **`figsize=(18,6)`**:
   - 这个参数指定了绘图区域的大小,单位是英寸。这里设置为宽18英寸,高6英寸。用来控制图形的长宽比例。

2. **`dpi=1600`**:
   - DPI(Dots Per Inch,像素每英寸)指定了图像分辨率。越高的DPI值意味着图像的质量越高,但同时也会增加图像的文件大小。1600是一个相对高的值,通常适用于需要高质量输出的图表(例如印刷)。

`alpha=alpha_scatterplot = 0.2` 和 `alpha_bar_chart = 0.55` 表示两个不同的透明度设置:

1. **`alpha=alpha_scatterplot = 0.2`**:
   - 这是为散点图(scatter plot)指定透明度的参数,值为0.2。`alpha` 参数用来控制图形的透明度,取值范围从0到1,0是完全透明,1是完全不透明。

2. **`alpha_bar_chart = 0.55`**:
   - 这是为条形图(bar chart)指定透明度的参数,值为0.55。同样地,这个值也是在0到1之间,表示图表的透明度。55%的不透明度使得条形图相对较为显著。

这些透明度设置可能用于改善图形的可视化表现,特别是在重叠或混杂数据时,适当的透明度能帮助更好地展示数据的结构和分布。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 21:11 | 显示全部楼层
FishC 发表于 2024-10-17 20:50
`fig = plt.figure(figsize=(18,6), dpi=1600)` 中的参数分别表示:

1. **`figsize=(18,6)`**:
plt.figure(figsize=(6,4))
fig, ax = plt.subplots()
df.Survived.value_counts().plot(kind='barh', color="blue", alpha=.65)
ax.set_ylim(-1, len(df.Survived.value_counts())) 
plt.title("Survival Breakdown (1 = Survived, 0 = Died)")
创建画布及子图的步骤?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 昨天 21:15 | 显示全部楼层
Terence888 发表于 2024-10-17 21:11
plt.figure(figsize=(6,4))
fig, ax = plt.subplots( ...


在 Matplotlib 中创建画布和子图的步骤如下:

1. **创建画布**:
   使用 `plt.figure()` 可以创建一个新的画布。可以通过参数 `figsize` 来指定画布的尺寸。

plt.figure(figsize=(6,4))

   这行代码创建了一个宽6英寸、高4英寸的画布。不过,在很多情况下,只需使用 `plt.subplots()` 就足够了,因为它也会自动创建一个图形和一个子图。

2. **创建子图**:
   使用 `plt.subplots()` 可以同时创建画布和子图。它返回一个包含 Figure 和 Axes 的元组。

fig, ax = plt.subplots()

   - `fig` 是 Figure 对象,代表整个绘图区域。
   - `ax` 是 Axes 对象,代表一个子图或绘图的实际区域。

3. **绘制数据**:
   通过使用 `ax` 对象的方法,你可以在子图上绘制数据。

df.Survived.value_counts().plot(kind='barh', color="blue", alpha=.65, ax=ax)

   这里,数据通过 `plot` 方法绘制为水平条形图,并指定颜色和透明度。注意使用 `ax=ax` 参数来确保绘制在正确的 Axes 上。

4. **设置图形属性**:
   可以使用 `ax` 对象的方法来设置图形的各项属性,如标题、坐标轴范围等。

ax.set_ylim(-1, len(df.Survived.value_counts()))
   plt.title("Survival Breakdown (1 = Survived, 0 = Died)")

这几步结合起来就实现了创建画布、子图,绘制数据和设置图形属性的完整流程。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 21:32 | 显示全部楼层
FishC 发表于 2024-10-17 21:15
在 Matplotlib 中创建画布和子图的步骤如下:

1. **创建画布**:
fig = plt.figure(figsize=(18,6))

#create a plot of two subsets, male and female, of the survived variable.
#After we do that we call value_counts() so it can be easily plotted as a bar graph. 
#'barh' is just a horizontal bar graph
df_male = df.Survived[df.Sex == 'male'].value_counts().sort_index()
df_female = df.Survived[df.Sex == 'female'].value_counts().sort_index()

ax1 = fig.add_subplot(121)
df_male.plot(kind='barh',label='Male', alpha=0.55)
df_female.plot(kind='barh', color='#FA2379',label='Female', alpha=0.55)
plt.title("Who Survived? with respect to Gender, (raw value counts) "); plt.legend(loc='best')
ax1.set_ylim(-1, 2) 

#adjust graph to display the proportions of survival by gender
ax2 = fig.add_subplot(122)
(df_male/float(df_male.sum())).plot(kind='barh',label='Male', alpha=0.55)  
(df_female/float(df_female.sum())).plot(kind='barh', color='#FA2379',label='Female', alpha=0.55)
plt.title("Who Survived proportionally? with respect to Gender"); plt.legend(loc='best')

ax2.set_ylim(-1, 2)
创建画布并添加两个子图
问题一:fig.add_subplot()什么时候使用
问题二:
df.Survived[df.Sex == 'male']
dataframe中提取某列值为value的代码是什么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 昨天 21:37 | 显示全部楼层
Terence888 发表于 2024-10-17 21:32
fig = plt.figure(figsize=(18,6))

#create a plot ...


### 问题一:`fig.add_subplot()` 什么时候使用

`fig.add_subplot()` 用于在一个已经创建的 `Figure` 对象上添加子图(Axes)。这在你需要在同一个画布上绘制多幅不同的图表时非常有用。这种方法特别适合需要灵活布置子图的位置和数量的场景。

`fig.add_subplot(121)` 中的参数 `121` 分别表示子图的行数、列数以及子图的索引位置:
- 第一个数字 `1` 表示总共一行。
- 第二个数字 `2` 表示总共两列。
- 第三个数字 `1` 表示当前子图是第1个。

所以 `fig.add_subplot(121)` 和 `fig.add_subplot(122)` 的组合是在一个画布上以一行分布两个子图。

### 问题二:`df.Survived` dataframe中提取某列值为特定值的代码是什么

假设你想从 DataFrame `df` 中提取 `Survived` 列中值为特定值(例如,1)的数据,可以使用布尔索引:
# 提取 Survived 列中值为1的行
df_survived_1 = df[df.Survived == 1]

这里,`df[df.Survived == 1]` 是通过布尔索引选择出 `Survived` 列中值为1的所有行。

如果需要提取某一列的值来进行其他操作,比如统计或绘图,可以继续从中进行操作,比如:
# 获取 Survived 列中值为1的行的其他列的数据
ages_survived_1 = df[df.Survived == 1]['Age']

这样,你可以提取出满足特定条件的任意列的数据。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 22:35 | 显示全部楼层
FishC 发表于 2024-10-17 21:37
### 问题一:`fig.add_subplot()` 什么时候使用

`fig.add_subplot()` 用于在一个已经创建的 `Figure ...
fig = plt.figure(figsize=(18,6))

#create a plot of two subsets, male and female, of the survived variable.
#After we do that we call value_counts() so it can be easily plotted as a bar graph. 
#'barh' is just a horizontal bar graph
df_male = df.Survived[df.Sex == 'male'].value_counts().sort_index()
df_female = df.Survived[df.Sex == 'female'].value_counts().sort_index()

ax1 = fig.add_subplot(121)
df_male.plot(kind='barh',label='Male', alpha=0.55)
df_female.plot(kind='barh', color='#FA2379',label='Female', alpha=0.55)
plt.title("Who Survived? with respect to Gender, (raw value counts) "); plt.legend(loc='best')
ax1.set_ylim(-1, 2) 

#adjust graph to display the proportions of survival by gender
ax2 = fig.add_subplot(122)
(df_male/float(df_male.sum())).plot(kind='barh',label='Male', alpha=0.55)  
(df_female/float(df_female.sum())).plot(kind='barh', color='#FA2379',label='Female', alpha=0.55)
plt.title("Who Survived proportionally? with respect to Gender"); plt.legend(loc='best')

ax2.set_ylim(-1, 2)
上述代码绘制的图像如下,请帮我解读
下载.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 昨天 22:36 | 显示全部楼层
Terence888 发表于 2024-10-17 22:35
fig = plt.figure(figsize=(18,6))

#create a plot ...


这段代码绘制了根据性别划分的生存数据的两幅水平条形图。让我们逐步解析这两幅图:

### 图1:基于性别的生存人数分布

- **位置:** 画布的左侧。
- **内容:** 绘制了两组数据,分别代表男性和女性的生存人数。
- **数据源:** `df_male` 和 `df_female`,两者都使用了 `df.Survived.value_counts().sort_index()` 来获取生存状态的计数。
- **显示方式:** 使用水平条形图 (`kind='barh'`)。
- **颜色和透明度:**
  - 男性用默认颜色,透明度为 `0.55`。
  - 女性用颜色 `#FA2379`(粉色),同样透明度 `0.55`。
- **标题:** “Who Survived? with respect to Gender, (raw value counts)”
- **y轴限定:** `ax1.set_ylim(-1, 2)` 确保显示范围从 -1 到 2。

这种图帮助我们直观地看到不同性别在生还者和非生还者中的绝对人数分布。

### 图2:基于性别的生存比例分布

- **位置:** 画布的右侧。
- **内容:** 与左图类似,但显示的是生存的相对比例。
- **数据处理:** 使用 `df_male/float(df_male.sum())` 和 `df_female/float(df_female.sum())` 计算比例。
- **显示方式:** 水平条形图。
- **颜色和透明度:**
  - 男性和女性都沿用左图的设定。
- **标题:** “Who Survived proportionally? with respect to Gender”
- **y轴限定:** 与左图相同,使用 `ax2.set_ylim(-1, 2)`。

这幅图展示了在每个性别类别中,生还者数占该类别总数的比例。这样可以看到女性或男性在各自群体内部生存的相对数量情况。

### 总结:

- **左图:** 显示了生存人数的绝对值,帮助我们快速了解不同性别人群在生存和非生存上的整体数量。
- **右图:** 显示了生存的相对比例,帮助理解每个性别内部的生存状况,从中看出哪一个性别在比例上更具有生存优势。

这两幅图结合在一起提供了丰富的视觉信息,有助于深入分析性别对生存率的影响。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 23:27 | 显示全部楼层
FishC 发表于 2024-10-17 22:36
这段代码绘制了根据性别划分的生存数据的两幅水平条形图。让我们逐步解析这两幅图:

### 图1:基于 ...

Here it’s clear that although more men died and survived in raw value counts, females had a greater survival rate proportionally (~25%), than men (~20%)

解析是这样是为什么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 昨天 23:34 | 显示全部楼层
Terence888 发表于 2024-10-17 23:27
Here it’s clear that although more men died and s ...


你的解析大致是正确的,下面是对这个结论的进一步解释:

### 原始数据 vs. 比例数据

1. **原始数量(左图)**:
   - 左图显示的是生存和死亡的绝对数量。从中可以看到,男性的生存和死亡人数在绝对数量上都要多于女性。
   - 不过这种数据有时候可能会让我们忽略每个性别内部的生存比例是否有差异。

2. **比例数据(右图)**:
   - 右图对每个性别进行了比例化处理,显示了生还者在每个性别中的比例。
   - 女性生存者比例高于男性意味着,在女性总人数中,生存的比例(例如 25%)高于男性总人数中的生存比例(例如 20%)。

### 为什么会得出这样的结论:

- **人数基数不同**:绝对数量不一定能反映生存率的真实趋势。例如,男性的总人数可能远多于女性,所以我们在绝对人数上看到更多男性生存和死亡。
- **比例反映率**:比例化处理有助于了解在男女各自群体中,生存情况的相对表现。在这里,尽管男性生存人数较多,但其生存率(活着的男性人数占男性总人数的百分比)低于女性。
- **数据直观化的优点**:通过将数据转换为比例,可以揭示我们用绝对数量往往难以直观看出的趋势。

这样的差异在数据分析中很常见,也是为何视觉化时使用比例而非绝对值能更好揭示某些有意义的趋势。这样分析的目的是帮助我们理解虽然某个群体在数量绝对值上有比较大的变化,但另一个群体在比例上可能展现出更有趣或重要的趋势。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 半小时前 | 显示全部楼层
FishC 发表于 2024-10-17 23:34
你的解析大致是正确的,下面是对这个结论的进一步解释:

### 原始数据 vs. 比例数据

男性的生存和死亡人数在绝对数量上都要多于女性这个怎么看出来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 半小时前 | 显示全部楼层
Terence888 发表于 2024-10-18 10:38
男性的生存和死亡人数在绝对数量上都要多于女性这个怎 ...


抱歉,我先前可能误解了图表的内容。如果出于真实数据的情况,我们应该仔细检查代码以及在这些图中显示的数据。根据你提到的代码以及解释:

1. **生存数量(左图)**:
   - 左图中的数据是用 `df_male.plot` 和 `df_female.plot` 分别绘制的,这个图展示了根据数据集中生存的绝对数量。
   - 如果 `df_male` 和 `df_female` 分别表示男性和女性的生存和死亡计数,并且代码显示男性计数更多,这就是得出男性生存和死亡人数在绝对数量上都较多的原因。但这种信息需要根据具体的数据集合来验证。

2. **如何确认**:
   - 确认这一点需依赖特定数据。在实例节点中,我们看 `df.Survived.value_counts().sort_index()` 返回了什么,包括男性和女性的具体数量。
   - 假设数据中男性乘客多于女性(比如 Titanic 数据集的情况),在总人数的统计中,男性生存和死亡的绝对数量往往确实会显得多一些。

总结:
- **确认你的数据**:查看数据集 `df` 中具体的 `Survived` 列有关男性和女性生存的具体计数。
- **查看代码实现**:确保代码中对 `df_male` 和 `df_female` 正确反映了针对生存数量的计数。

了解特定图表的数据来源和背景非常关键,因为它直接影响对图数据的解读。希望这段描述能帮助你更清晰地理解图表中的信息。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-18 11:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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