# 1. 问题描述
对右图进行修改
- 请更换图形的风格
- 请将 x 轴的数据改为-10 到 10
- 请自行构造一个 y 值的函数
- 将直方图上的数字,位置改到柱形图的内部垂直居中的位置
- 对成绩数据 data1402.csv 进行分段统计:每 5 分作为一个分数段,展示出每个分数段的人数直方图。
- 自行创建出 10 个学生的 3 个学期排名数据,并通过直方图进行对比展示。
- 线图
- 把这个图像做一些调整,要求出现 5 个完整的波峰。
- 调大 cos 波形的幅度
- 调大 sin 波形的频率
- 用线图展示北京空气质量数据
展示 10-15 年 PM 指数月平均数据的变化情况,一幅图中有 6 条曲线,每年 1 条曲线。
# 2. 实验环境
Microsoft Windows 10 版本18363
PyCharm 2020.2.1 (Community Edition)
Python 3.8(Scrapy 2.4.0 + numpy 1.19.4 + pandas 1.1.4 + matplotlib 3.3.3)
# 3. 实验步骤及结果
- 对右图进行修改
- 请更换图形的风格
- 请将 x 轴的数据改为-10 到 10
- 请自行构造一个 y 值的函数
- 将直方图上的数字,位置改到柱形图的内部垂直居中的位置
```python
from matplotlib import pyplot as plt
import numpy as np
fig, ax = plt.subplots()
plt.style.use('classic')
plt.title("square numbers")
ax.set_xlim(-11, 11)
ax.set_ylim(0, 100)
x = np.array(range(-10, 11))
y = x * x
rect1 = plt.bar(x, y)
for r in rect1:
ax.text(r.get_x(), r.get_height() / 2, r.get_height())
plt.show()
```
![](https://www.writebug.com/myres/static/uploads/2022/8/1/29494a2ba123ab7861a43c9bedde6d38.writebug)
如图使用 classic 风格,x 轴数据为[-10, 10]的整数,构造的函数为 y=x2,显示位置并将其将数值改到了柱形图内部垂直居中的位置。
- 对成绩数据 data1402.csv 进行分段统计:每 5 分作为一个分数段,展示出每个分数段的人数直方图。
```python
from matplotlib import pyplot as plt
import numpy as np
import pandas as pd
df = pd.read_csv("./data1402.csv", encoding='utf-8', dtype=str)
df = pd.DataFrame(df, columns=['score'], dtype=np.float)
section = np.array(range(0, 105, 5))
result = pd.cut(df['score'], section)
count = pd.value_counts(result, sort=False)
fig, ax = plt.subplots()
plt.style.use('classic')
ax.set_xlim(0, 100)
rect1 = plt.bar(np.arange(2.5, 100, 5), count, width=5)
for r in rect1:
ax.text(r.get_x(), r.get_height(), r.get_height())
plt.show()
```
![](https://www.writebug.com/myres/static/uploads/2022/8/1/fd68440334f4ea23beabfbeec7a26a61.writebug)
- 自行创建出 10 个学生的 3 个学期排名数据,并通过直方图进行对比展示。
```c++
import random
semester1 = np.arange(1, 11)
semester2 = np.arange(1, 11)
semester3 = np.arange(1, 11)
random.shuffle(semester1)
random.shuffle(semester2)
random.shuffle(semester3)
df = pd.DataFrame({'semester1':semester1, 'semester2':semester2, 'semester3':semester3})
print(df)
df.to_csv("data1403.csv", encoding="utf-8")
```
使用如上代码创建出随机的排名数据。
![](https://www.writebug.com/myres/static/uploads/2022/8/1/4866b44100befc5d632d183b7b4b3195.writebug)
```c++
df = pd.read_csv("./data1403.csv", encoding='utf-8', dtype=str)
df = pd.DataFrame(df, columns=['semester1', 'semester2', 'semester3'], dtype=np.int)
df['total'] = (df['semester1'] + df['semester2'] + df['semester3']) / 3
df = df.sort_values('total')
fig, ax = plt.subplots()
plt.style.use('classic')
plt.title('RANK')
width = 0.2
x = np.array(range(0, 10))
rect1 = ax.bar(x-2*width, df['semester1'], width=width, label='semester1')
rect2 = ax.bar(x-width, df['semester2'], width=width, label='semester2')
rect3 = ax.bar(x, df['semester3'], width=width, label='semester3')
for r in rect1:
ax.text(r.get_x(), r.get_height(), r.get_height())
for r in rect2:
ax.text(r.get_x(), r.get_height(), r.get_height())
for r in rect3:
ax.text(r.get_x(), r.get_height(), r.get_height())
plt.legend(ncol=1)
plt.show()
```
如上代码绘图:
![](https://www.writebug.com/myres/static/uploads/2022/8/1/1176a0325af398198b6b0b161ed8ffd4.writebug)
- 线图
- 把这个图像做一些调整,要求出现 5 个完整的波峰。
- 调大 cos 波形的幅度
- 调大 sin 波形的频率
```python
import numpy as np
from matplotlib import pyplot as plt
x = np.linspace(-5 * np.pi, 5 * np.pi, 500)
y1 = 3 * np.cos(x)
y2 = np.sin(4*x)
fig, ax = plt.subplots()
plt.style.use('classic')
ax.spines["right"].set_visible(False)
ax.spines["top"].set_visible(False)
ax.spines['bottom'].set_position(('data',0))
ax.xaxis.set_ticks_position('bottom')
ax.spines['left'].set_position(('data',0))
ax.yaxis.set_ticks_position('left')
plt.plot(x, y1, color='blue', linestyle='-', label='y=3cosx')
plt.plot(x, y2, color='red', linestyle='-', label='y=sin3x')
plt.legend()
plt.show()
```
![](https://www.writebug.com/myres/static/uploads/2022/8/1/9a6983526fef5784553f72ef6b269638.writebug)
- 用线图展示北京空气质量数据
展示 10-15 年 PM 指数月平均数据的变化情况,一幅图中有 6 条曲线,每年 1 条曲线。
```c++
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
orig_df = pd.read_csv("./BeijingPM20100101_20151231.csv", encoding='utf-8', dtype=str)
orig_df = pd.DataFrame(orig_df, columns=['year', 'month', 'PM_US Post'])
df = orig_df.dropna(0, how='any')
df['month'] = df['month'].astype(int)
df['year'] = df['year'].astype(int)
df['PM_US Post'] = df['PM_US Post'].astype(int)
df.reset_index(drop=True, inplace=True)
num = len(df)
section = np.arange(1, 13)
record = 0
fig, ax = plt.subplots()
plt.style.use('classic')
plt.title("2010-2015 Beijing average PM2.5(from PM_US Post) per month")
for nowyear in range(2010, 2016):
i = record
result = [0 for i in range(13)]
nowsum = 0
cntday = 0
nowmonth = 1
while i < num:
if df['month'][i] == nowmonth:
cntday = cntday + 1
nowsum = nowsum + df['PM_US Post'][i]
else:
if df['year'][i] != nowyear:
record = i
result[nowmonth] = nowsum / cntday
break
result[nowmonth] = nowsum / cntday
cntday = 1
nowsum = df['PM_US Post'][i]
nowmonth = df['month'][i]
i = i + 1
result = result[1:]
#
x = np.array(range(1, 13))
plt.plot(x, result, linestyle='-', label=str(nowyear))
plt.legend()
plt.show()
```
![](https://www.writebug.com/myres/static/uploads/2022/8/1/45456fb36a3880f3df2da463f0e9459a.writebug)
# 4. 心得与体会
在本次实验中,通过几道题目的引导,逐步掌握了 python 中使用 matplotlib 并结合之前的数据分析处理工具 numpy 及 pandas 等对数据可视化的基本方法。非常感谢老师的实验设计!
基于Python实现数据可视化【100011750】
版权申诉
86 浏览量
2023-04-10
10:24:02
上传
评论
收藏 1005KB ZIP 举报
神仙别闹
- 粉丝: 2687
- 资源: 7649
最新资源
- vscode-1.64.1.tar源码文件
- vscode-1.64.0.tar源码文件
- vscode-1.52.0.tar源码文件
- Music-Player +PlayerActivity+ rockplayer+ SeeJoPlayer 播放器JAVA源码
- vscode-1.46.0.tar源码文件
- 最近很火植物大战僵尸杂交版2.08苹果+安卓+PC+防闪退工具V2+修改工具+高清工具+通关存档整合包更新
- 超级好用的截图工具PixPin,可录制Gif图
- Screenshot_2024-05-21-17-06-42-64_2332cb9b27b851b548ba47a91682926c.jpg
- 毕业设计参考 - 基于树莓派、OpenCV及Python的人脸识别
- node-v18.20.2-linux-arm64
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈