此部分内容会每日更新,包括但不限于基础知识,进阶知识,数据处理,图表展示,数据分析实战,机器学习算法等~
!!!本人统计学硕士在读,想在2024年完成sql、python、R语言、stata、matlab等软件的复盘和巩固,目前在做python的复习~
最近每日都会更新python实践习题!后续考虑出相关视频进行讲解说明,请大家点赞+收藏+持续关注哈,大家一起沟通交流~
基本图表绘制
1. 使用Matplotlib绘制一个展示某公司2021年逐月销售额的折线图。
import matplotlib.pyplot as plt
# 假设的销售额数据
months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
sales = [2000, 2500, 2100, 2300, 2700, 2900, 3100, 2800, 2600, 2900, 3300, 3600]
# 绘制折线图
plt.plot(months, sales, marker='o')
plt.title('2021年逐月销售额')
plt.xlabel('月份')
plt.ylabel('销售额')
plt.grid(True)
plt.show()
2. 绘制一个表示五种不同水果价格对比的柱状图。
import matplotlib.pyplot as plt
# 假设的水果价格数据
fruits = ['苹果', '香蕉', '橙子', '葡萄', '桃子']
prices = [3.5, 2.2, 2.8, 4.0, 2.5]
# 绘制柱状图
plt.bar(fruits, prices)
plt.title('五种不同水果价格对比')
plt.xlabel('水果')
plt.ylabel('价格')
plt.grid(True)
plt.show()
3. 创建一个散点图,展示两个变量之间的相关性。
import matplotlib.pyplot as plt
import numpy as np
# 假设的两个变量数据
x = np.random.rand(50)
y = 2 * x + np.random.randn(50) * 0.3
# 绘制散点图
plt.scatter(x, y)
plt.title('两个变量之间的相关性')
plt.xlabel('变量X')
plt.ylabel('变量Y')
plt.grid(True)
plt.show()
4. 根据一组数据绘制箱线图,展示数据的分布特征。
import matplotlib.pyplot as plt
import numpy as np
# 假设的数据
data = np.random.normal(100, 20, 200)
# 绘制箱线图
plt.boxplot(data)
plt.title('数据的分布特征')
plt.grid(True)
plt.show()
5. 绘制一个展示股票每日收盘价的折线图,并标注最高点。
import matplotlib.pyplot as plt
import numpy as np
# 假设的股票每日收盘价数据
dates = np.arange(start='2021-01-01', periods=100, freq='B')
prices = (np.random.randn(100) + 100).cumsum()
# 绘制折线图
plt.plot(dates, prices, marker='o')
plt.title('股票每日收盘价')
plt.xlabel('日期')
plt.ylabel('收盘价')
plt.grid(True)
# 标注最高点
max_price_index = prices.argmax()
max_price = prices[max_price_index]
max_date = dates[max_price_index]
plt.annotate(f'最高点: {max_price:.2f}', xy=(max_date, max_price), xytext=(10, -5),
textcoords='offset points', arrowprops=dict(arrowstyle="->"))
plt.show()
6. 绘制一个面积图,展示某产品市场份额随时间的变化。
import matplotlib.pyplot as plt
import numpy as np
# 假设的市场份额数据
months = np.arange(1, 13)
market_share = np.random.rand(12)
# 绘制面积图
plt.stackplot(months, [market_share], labels=['市场份额'])
plt.title('产品市场份额随时间的变化')
plt.xlabel('月份')
plt.ylabel('市场份额')
plt.legend()
plt.grid(True)
plt.show()
7. 绘制一个饼图,展示不同部门的年度预算分配。
import matplotlib.pyplot as plt
# 假设的不同部门预算数据
departments = ['销售', '市场', '研发', '人力资源', '行政']
budgets = [20000, 15000, 30000, 10000, 5000]
# 绘制饼图
plt.pie(budgets, labels=departments, autopct='%1.1f%%', startangle=140)
plt.title('不同部门的年度预算分配')
plt.axis('equal') # 确保饼图是圆的
plt.show()
8. 绘制一个堆叠柱状图,比较不同季度各产品的销售额。
import matplotlib.pyplot as plt
# 假设的销售额数据
products = ['产品A', '产品B', '产品C']
quarters = ['Q1', 'Q2', 'Q3', 'Q4']
sales_data = [
[1000, 1200, 1500, 1300],
[800, 1100, 1400, 1200],
[700, 900, 1100, 1000]
]
# 绘制堆叠柱状图
width = 0.35
index = np.arange(len(quarters))
plt.bar(index, sales_data[0], width, label=products[0])
plt.bar(index, sales_data[1], width, bottom=sales_data[0], label=products[1])
plt.bar(index, sales_data[2], width, bottom=np.sum(sales_data[:2], axis=0), label=products[2])
plt.xlabel('季度')
plt.ylabel('销售额')
plt.title('不同季度各产品的销售额')
plt.xticks(index, quarters)
plt.legend()
plt.show()
9. 创建一个柱状图,展示不同年龄段人群的网购频率。
import matplotlib.pyplot as plt
# 假设的网购频率数据
age_groups = ['18-24', '25-34', '35-44', '45-54', '55+']
shopping_frequency = [5, 4, 3, 2, 1]
# 绘制柱状图
plt.bar(age_groups, shopping_frequency)
plt.title('不同年龄段人群的网购频率')
plt.xlabel('年龄段')
plt.ylabel('网购频率')
plt.grid(True)
plt.show()
10. 绘制一个时间序列图,展示某城市一年内的降雨量变化。
import matplotlib.pyplot as plt
import numpy as np
# 假设的降雨量数据
dates = np.arange(start='2021-01-01', periods=12, freq='M')
rainfall = np.random.randint(50, 200, size=12)
# 绘制时间序列图
plt.plot(dates, rainfall, marker='o')
plt.title('某城市一年内的降雨量变化')
plt.xlabel('日期')
plt.ylabel('降雨量')
plt.grid(True)
plt.xticks(rotation=45) # 如果日期标签重叠,可以旋转它们
plt.show()
11. 绘制一个极坐标图,展示风向的频率分布。
import numpy as np
import matplotlib.pyplot as plt
# 假设的风向频率数据
wind_directions = np.array([0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 30, 20, 10, 5, 0])
frequencies = np.array([5, 10, 15, 20, 25, 30, 35, 30, 25, 20, 15, 10, 5, 5, 5])
# 创建极坐标图
plt.figure(figsize=(6, 6))
ax = plt.subplot(111, polar=True)
# 绘制柱状图
bars = ax.bar(wind_directions, frequencies, width=2.5, color='b', alpha=0.5)
# 设置标题
plt.title("风向频率分布")
# 显示图形
plt.show()
12. 使用Matplotlib绘制一个热力图,展示矩阵数据的分布情况。
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# 假设的矩阵数据
data = np.random.rand(10, 10)
# 创建热力图
plt.figure(figsize=(8, 6))
sns.heatmap(data, annot=True, cmap='coolwarm')
# 设置标题和坐标轴标签
plt.title("矩阵数据热力图")
plt.xlabel("X-axis")
plt.ylabel("Y-axis")
# 显示图形
plt.show()
13. 绘制一个展示不同国家GDP的柱状图,并按GDP大小排序。
import matplotlib.pyplot as plt
# 假设的国家GDP数据
countries = ['China', 'USA', 'Japan', 'Germany', 'UK']
gdp = [14.34, 21.43, 5.08, 3.85, 2.83] # 单位:万亿美元
# 按GDP大小排序
sorted_indices = np.argsort(gdp)[::-1]
sorted_countries = [countries[i] for i in sorted_indices]
sorted_gdp = [gdp[i] for i in sorted_indices]
# 绘制柱状图
plt.figure(figsize=(10, 6))
plt.bar(sorted_countries, sorted_gdp, color='skyblue')
# 设置标题和坐标轴标签
plt.title("不同国家GDP柱状图")
plt.xlabel("国家")
plt.ylabel("GDP (万亿美元)")
# 显示图形
plt.show()
14. 绘制一个带有多个子图的图表,每个子图展示不同类别的数据。
import numpy as np
import matplotlib.pyplot as plt
# 假设的数据
categories = ['A', 'B', 'C']
data = {cat: np.random.rand(10) for cat in categories}
# 创建一个2x2的子图网格
plt.figure(figsize=(10, 8))
for i, (name, dataset) in enumerate(data.items()):
plt.subplot(2, 2, i + 1)
plt.plot(dataset, marker='o')
plt.title(f'Category {name}')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
# 调整子图之间的间距
plt.tight_layout()
# 显示图形
plt.show()
15. 绘制一个展示人口增长趋势的折线图,并设置合适的坐标轴标签。
import numpy as np
import matplotlib.pyplot as plt
# 假设的人口增长数据
years = np.arange(2010, 2021)
population = np.array([13.41, 13.51, 13.61, 13.71, 13.83, 13.95, 14.07, 14.19, 14.31, 14.43, 14.55]) # 单位:亿人
# 绘制折线图
plt.figure(figsize=(10, 6))
plt.plot(years, population, marker='o', color='green')
# 设置标题和坐标轴标签
plt.title("人口增长趋势")
plt.xlabel("年份")
plt.ylabel("人口数量 (亿人)")
# 显示图形
plt.show()
16. 使用散点图展示两组数据的线性关系,并添加回归线。
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
# 假设的两组数据
x = np.random.rand(50)
y = 2 * x + 0.5 * np.random.randn(50)
# 绘制散点图
plt.figure(figsize=(10, 6))
plt.scatter(x, y, color='blue')
# 添加回归线
slope, intercept, r_value, p_value, std_err = stats.linregress(x, y)
fit_y = slope * x + intercept
plt.plot(x, fit_y, color='red', label='Regression Line')
# 设置标题和坐标轴标签
plt.title("散点图与回归线")
plt.xlabel("X-axis")
plt.ylabel("Y-axis")
plt.legend()
# 显示图形
plt.show()
17. 绘制一个堆叠面积图,比较多个时间序列数据的变化趋势。
import numpy as np
import matplotlib.pyplot as plt
# 假设的时间序列数据
years = np.arange(2010, 2021)
series1 = np.random.rand(11)
series2 = np.random.rand(11)
series3 = np.random.rand(11)
# 绘制堆叠面积图
plt.figure(figsize=(10, 6))
plt.stackplot(years, series1, series2, series3, labels=['Series 1', 'Series 2', 'Series 3'])
# 设置标题和坐标轴标签
plt.title("堆叠面积图")
plt.xlabel("年份")
plt.ylabel("值")
plt.legend(loc='upper left')
# 显示图形
plt.show()
18. 绘制一个误差棒图,展示实验数据的平均值和标准差。
import numpy as np
import matplotlib.pyplot as plt
# 假设的实验数据
x = np.arange(5)
means = np.random.rand(5)
std_devs = np.random.rand(5) / 2
# 绘制误差棒图
plt.figure(figsize=(10, 6))
plt.errorbar(x, means, yerr=std_devs, fmt='o')
# 设置标题和坐标轴标签
plt.title("误差棒图")
plt.xlabel("X-axis")
plt.ylabel("平均值")
# 显示图形
plt.show()
19. 绘制一个六边形箱线图,用于比较多个变量的分布特征。
请注意,Matplotlib本身并不直接支持六边形箱线图,但我们可以使用Seaborn库来绘制箱线图,它提供了更丰富的可视化选项。
import seaborn as sns
import numpy as np
import pandas as pd
# 假设的数据
np.random.seed(0)
data = pd.DataFrame({
'A': np.random.normal(100, 20, 200),
'B': np.random.normal(90, 20, 200),
'C': np.random.normal(80, 20, 200),
'D': np.random.normal(70, 20, 200),
'E': np.random.normal(60, 20, 200)
})
# 绘制箱线图
plt.figure(figsize=(10, 6))
sns.boxplot(data=data[['A', 'B', 'C', 'D', 'E']])
# 设置标题和坐标轴标签
plt.title("六边形箱线图")```
### 自定义图表样式和布局
**1. 自定义一个折线图的线条颜色、宽度和样式。**
```python
import matplotlib.pyplot as plt
import numpy as np
# 示例数据
x = np.linspace(0, 10, 100)
y = np.sin(x)
# 绘制折线图并自定义线条样式
plt.plot(x, y, color='red', linewidth=2, linestyle='--')
plt.show()
2. 设置柱状图的柱体颜色为渐变色,并添加阴影效果。
import matplotlib.pyplot as plt
# 示例数据
categories = ['A', 'B', 'C', 'D']
values = [10, 15, 7, 10]
# 创建柱状图并设置渐变色和阴影效果
plt.bar(categories, values, color=['#FF9999', '#66B3FF', '#99FF99', '#FFCC99'], edgecolor='black', linewidth=1)
plt.gca().set_xticklabels(categories, rotation=45)
plt.show()
注意:Matplotlib的bar
函数本身并不直接支持渐变色。实现渐变色通常需要使用更复杂的自定义绘图方法,或者通过其他库如Seaborn等来实现。
3. 自定义饼图的扇区颜色,并添加图例说明。
import matplotlib.pyplot as plt
# 示例数据
labels = ['A', 'B', 'C', 'D']
sizes = [15, 30, 45, 10]
colors = ['#FF9999', '#66B3FF', '#99FF99', '#FFCC99']
# 绘制饼图并自定义扇区颜色
plt.pie(sizes, labels=labels, colors=colors, autopct='%1.1f%%', startangle=140)
plt.axis('equal') # 确保饼图为圆形
plt.legend(labels, loc='best') # 添加图例
plt.show()
4. 调整散点图的大小和分辨率,以适应不同的展示需求。
调整图表大小通常通过plt.figure()
函数来实现,而分辨率则依赖于保存图表时所用的参数。
import matplotlib.pyplot as plt
import numpy as np
# 示例数据
x = np.random.rand(50)
y = np.random.rand(50)
# 创建图表并设置大小
plt.figure(figsize=(8, 6)) # 设置图表大小
plt.scatter(x, y)
plt.show()
5. 自定义折线图的坐标轴标签和标题,并设置字体样式。
import matplotlib.pyplot as plt
import numpy as np
# 示例数据
x = np.linspace(0, 10, 100)
y = np.sin(x)
# 绘制折线图并自定义坐标轴标签和标题
plt.plot(x, y)
plt.xlabel('X-axis Label', fontsize=12, fontweight='bold')
plt.ylabel('Y-axis Label', fontsize=12, fontstyle='italic')
plt.title('Custom Line Plot', fontsize=14)
plt.show()
6. 修改柱状图的网格线样式,使其更加清晰易读。
import matplotlib.pyplot as plt
# 示例数据
categories = ['A', 'B', 'C', 'D']
values = [10, 15, 7, 10]
# 绘制柱状图并设置网格线样式
plt.bar(categories, values)
plt.grid(axis='y', alpha=0.75, linestyle='--', color='gray') # 设置网格线样式
plt.show()
7. 在饼图中添加百分比标签,以便更直观地展示数据。
这已经在第3个问题的答案中实现了,通过autopct
参数。
8. 调整面积图的透明度,以便更好地展示多个系列的数据。
import matplotlib.pyplot as plt
import numpy as np
# 示例数据
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
# 绘制面积图并调整透明度
plt.fill_between(x, y1, alpha=0.5, color='blue', label='sin(x)')
plt.fill_between(x, y2, alpha=0.5, color='red', label='cos(x)')
plt.legend()
plt.show()
9. 自定义热力图的颜色映射,以突出显示特定的数据范围。
import matplotlib.pyplot as plt
import numpy as np
from matplotlib import cm
# 示例数据
data = np.random.rand(10, 10)
# 创建热力图并自定义颜色映射
fig, ax = plt.subplots()
cax = ax.matshow(data, cmap=cm.coolwarm) # 使用coolwarm颜色映射
fig.colorbar(cax)
plt.show()
10. 修改图表的背景色和边框样式,以符合特定的设计风格。
import matplotlib.pyplot as plt
# 修改图表背景色和边框样式
plt.style.use('seaborn-whitegrid') # 使用内置样式
plt.figure(facecolor='lightgrey') # 设置图表背景色
plt.gca().set_axisbelow(True) # 将网格线置于坐标轴刻度之下
plt.grid(axis='both', alpha=0.5, linestyle='--') # 设置网格线样式
plt.box(on=True, linewidth=2, facecolor='white') # 设置坐标轴边框样式
plt.show()
11. 调整子图之间的间距和大小,使其布局更加合理美观。
import matplotlib.pyplot as plt
import numpy as np
# 示例数据
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
# 创建子图并调整间距和大小
fig, axs = plt.subplots(nrows=2, ncols=1, figsize=(8, 6), gridspec_kw={'hspace': 0.3, 'wspace': 0.2})
axs[0].plot(x, y1)
axs[0].set_title('Sin(x)')
axs[1].plot(x, y2)
axs[1].set_title('Cos(x)')
plt.tight_layout() # 调整子图布局以填充整个图表区域
plt.show()
12. 自定义图表的图例位置和样式。
import matplotlib.pyplot as plt
# 示例数据
labels = ['A', 'B', 'C']
sizes = [15, 30, 55]
colors = ['#FF9999', '#66B3FF', '#99FF99']
# 绘制图表并自定义图例位置和样式
plt.pie(sizes, labels=labels, colors=colors, autopct='%1.1f%%')
plt.legend(loc='upper right', bbox_to_anchor=(1.1, 1.05), ncol=1, borderaxespad=0.) # 设置图例位置和样式
plt.axis('equal') # 确保饼图为圆形
plt.show()
13. 在图表中添加自定义的注释和箭头。
import matplotlib.pyplot as plt
import matplotlib.annotations as annotations
# 示例数据
x = np.linspace(0, 10, 100)
y = np.sin(x)
# 绘制图表并添加注释和箭头
plt.plot(x, y)
plt.annotate('Peak', xy=(np.pi/2, 1), xytext=(np.pi/2 + 1, 0.5),
arrowprops=dict(facecolor='red', shrink=0.05)) # 添加带箭头的注释
plt.show()
14. 设置图表中数据的显示格式(如百分比、千分位等)。
import matplotlib.pyplot as plt
import numpy as np
# 示例数据
x = np.linspace(0, 10, 100)
y = np.sin(x) * 1000 # 假设数据为千分位
# 绘制图表并设置数据显示格式
plt.plot(x, y)
plt.ticklabel_format(style='sci', axis='y', scilimits=(0,0)) # 使用科学计数法显示y轴数据,并限制小数位数
plt.gca().yaxis.get_major_formatter().set_useOffset(False) # 不使用偏移量
plt.show()
15. 在图表中添加文本水印或背景图片。
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
# 读取背景图片
bg_img = mpimg.imread('background.png')
# 绘制图表并添加背景图片
fig, ax = plt.subplots()
ax.imshow(bg_img, extent=[0, 10, 0, 1], aspect='auto') # 设置背景图片位置和大小
ax.plot([1, 2, 3, 4], [1, 4, 2, 3]) # 绘制数据曲线
# 添加文本水印
ax.text(5, 0.5, 'Watermark', fontsize=12, color='white', alpha=0.5, transform=ax.transAxes)
plt.show()
交互式图表和动画效果
1. 创建一个交互式折线图,允许用户通过滑动条选择展示不同时间段的数据。
import numpy as np
import matplotlib.pyplot as plt
from ipywidgets import interact, fixed, IntSlider
# 假设您已经有了一个时间序列数据集
x = np.arange(0, 10, 0.1)
y = np.sin(x)
def plot_interactive_line(start_index, end_index):
plt.figure(figsize=(10, 6))
plt.plot(x[start_index:end_index], y[start_index:end_index])
plt.show()
# 设置滑动条的范围
start_range = (0, len(x) - 10)
end_range = (10, len(x))
# 使用ipywidgets的interact函数创建交互式图表
interact(plot_interactive_line, start_index=IntSlider(min=start_range[0], max=start_range[1], step=1, value=0),
end_index=IntSlider(min=end_range[0], max=end_range[1], step=1, value=10),
continuous_update=False);
2. 实现一个交互式柱状图,用户可以通过点击柱体来显示更多信息。
from matplotlib.widgets import Cursor
# 假设数据
categories = ['A', 'B', 'C', 'D', 'E']
values = [23, 45, 12, 34, 56]
fig, ax = plt.subplots()
bars = ax.bar(categories, values)
def onclick(event):
ind = event.ind[0]
print(f'Clicked on bar {categories[ind]}: {values[ind]}')
cid = fig.canvas.mpl_connect('button_press_event', onclick)
plt.show()
3. 创建一个散点图,当鼠标悬停在数据点上时显示提示框。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.offsetbox import AnnotationBbox, OffsetBox
from matplotlib.text import Text
# 假设数据
x = np.random.rand(20)
y = np.random.rand(20)
fig, ax = plt.subplots()
scatter = ax.scatter(x, y)
annotations = []
for i, txt in enumerate(zip(x, y)):
xy = txt
text = ax.annotate(f"({xy[0]:.2f}, {xy[1]:.2f})", xy=xy,
xytext=(20, 20),
textcoords="offset points",
bbox=dict(boxstyle="round", fc="w"),
arrowprops=dict(arrowstyle="->"))
annotations.append(text)
def hover(event):
if event.inaxes == ax:
cont, ind = scatter.contains(event)
if cont:
update_annotations(ind)
else:
for ann in annotations:
ann.set_visible(False)
fig.canvas.draw_idle()
def update_annotations(ind):
for i in range(len(annotations)):
ann = annotations[i]
ann.xy = (scatter.get_offsets()[ind["ind"][0]])
ann.set_text(f"({scatter.get_offsets()[ind['ind'][0]][0]:.2f}, {scatter.get_offsets()[ind['ind'][0]][1]:.2f})")
ann.get_bbox_patch().set_alpha(0.4)
ann.set_visible(True)
fig.canvas.draw_idle()
fig.canvas.mpl_connect("motion_notify_event", hover)
plt.show()
4. 制作一个动态更新的折线图,实时展示最新数据的变化趋势。
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
fig, ax = plt.subplots()
xdata, ydata = [], []
ln, = plt.plot([], [], 'ro-')
def init():
ax.set_xlim(0, 2*np.pi)
ax.set_ylim(-1, 1)
return ln,
def update(frame):
xdata.append(frame)
ydata.append(np.sin(frame))
ln.set_data(xdata, ydata)
return ln,
ani = animation.FuncAnimation(fig, update, frames=np.linspace(0, 2*np.pi, 128),
init_func=init, blit=True)
plt.show()
5. 实现一个动画效果的柱状图,用于展示数据随时间的变化过程。
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
fig, ax = plt.subplots()
rects1 = ax.bar([1, 2, 3, 4, 5], [10, 15, 7, 10, 5], label='Initial')
def animate(i):
rects1.set_height([15, 10, 20, 15, 10])
return rects1,
ani = animation.FuncAnimation(fig, animate, frames=range(10),
interval=200, blit=True)
plt.show()
##(说明:后面题目较为复杂,在B站讲解的时候进行完善)