当前位置:   article > 正文

数学建模——Python绘图(可视化)_python怎么根据模型画图

python怎么根据模型画图

一、基础绘图

1、折线图(matplotlib)

具体步骤参考本人之前的文章

  1. from matplotlib import pyplot as plt
  2. x = range(11,31)
  3. y_1 = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
  4. y_2 = [1,0,3,1,2,2,3,3,2,1,2,1,1,1,1,1,1,1,1,1]
  5. #设置图形大小
  6. plt.figure(figsize=(20,8),dpi=80)
  7. #画两条线,并写明哪条线表示什么,设置线条样式
  8. plt.plot(x,y_1,label="得分1",color="coral",linewidth=5)
  9. plt.plot(x,y_2,label="得分2",color="cyan",linestyle='--')
  10. #设置x轴刻度
  11. _xtick_labels = ["{}岁".format(i) for i in x]
  12. plt.xticks(x,_xtick_labels)
  13. #plt.yticks(range(0,9))
  14. #显示中文字体
  15. plt.rcParams['font.sans-serif'] = ['SimHei',]
  16. #绘制网格,alpha设置网格透明度
  17. plt.grid(alpha=0.5,linestyle=':')
  18. #添加图例(在指定位置显示线条对应的含义)
  19. plt.legend(loc="upper left")
  20. plt.show()
'
运行

2、条形图

  1. from matplotlib import pyplot as plt
  2. a = []
  3. b = []
  4. plt.figure(figsize=(20,8),dpi=80)
  5. #绘制条形图
  6. plt.bar(range(len(a)),b,width=0.3)
  7. #设置字符串到x轴
  8. plt.xticks(range(len(a)),a,rotation=90)
  9. plt.rcParams['font.sans-serif'] = ['SimHei',]
  10. plt.show()
'
运行

多条条形图:

  1. from matplotlib import pyplot as plt
  2. a = ["猩球崛起3:终极之战","敦刻尔克","蜘蛛侠:英雄归来","战狼2"]
  3. b_16 = [15746,312,4497,319]
  4. b_15 = [12357,156,2045,168]
  5. b_14 = [2358,399,2358,362]
  6. bar_width = 0.2
  7. x_14 = list(range(len(a)))
  8. x_15 = [i+bar_width for i in x_14]
  9. x_16 = [i+bar_width*2 for i in x_14]
  10. plt.figure(figsize=(8,8),dpi=80)
  11. plt.bar(range(len(a)),b_14,width=bar_width,label="9月14日")
  12. plt.bar(x_15,b_15,width=bar_width,label="9月15日")
  13. plt.bar(x_16,b_16,width=bar_width,label="9月16日")
  14. plt.legend()
  15. plt.xticks(x_15,a)
  16. plt.rcParams['font.sans-serif'] = ['SimHei',]
  17. plt.show()
'
运行

3、散点图

  1. from matplotlib import pyplot as plt
  2. y_3 = [11,17,16,11,12,11,12,6,6,7,8,9,12,15,14,17,18,21,16,17,20,14,15,15,15,19,21,22,22,22,23]
  3. y_10 = [26,26,28,19,21,17,16,19,18,20,20,19,22,23,17,20,21,20,22,15,11,15,5,13,17,10,11,13,12,13,6]
  4. x_3 = range(1,32)
  5. x_10 = range(51,82)
  6. #设置图形大小
  7. plt.figure(figsize=(20,8),dpi=80)
  8. #散点图和折线图的区别
  9. plt.scatter(x_3,y_3,label="3月份",color="red")
  10. plt.scatter(x_10,y_10,label="10月份")
  11. _x = list(x_3)+list(x_10)
  12. _xtick_labels = ["3月{}日".format(i) for i in x_3]
  13. _xtick_labels += ["10月{}日".format(i-50) for i in x_10]
  14. plt.xticks(_x[::3],_xtick_labels[::3],rotation=90)
  15. #添加图例
  16. plt.legend(loc="upper left")
  17. #添加描述信息
  18. plt.xlabel("时间")
  19. plt.ylabel("温度")
  20. plt.title("标题")
  21. plt.rcParams['font.sans-serif'] = ['SimHei',]
  22. plt.show()
'
运行

4、饼图

平面基础饼图

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. # 数据
  4. size = [34,20,20,20,6]
  5. # 设置中文
  6. plt.rcParams['font.sans-serif'] = ['SimHei',]
  7. # 绘图(标明各扇形含义)
  8. plt.pie(size, labels=["Windows", "MAC", "Linux", "Android", "Other"])
  9. #设置标题
  10. plt.title("手机系统占比分析")
  11. plt.show()
'
运行

立体饼图

  1. import matplotlib.pyplot as plt
  2. data = [2052380, 11315444, 20435242, 7456627, 3014264, 1972395, 185028]
  3. # 数据标签
  4. labels = ['none', 'primary', 'junior', 'senior', 'specialties', 'bachelor', 'master']
  5. # 各区域颜色
  6. colors = ['red', 'orange', 'yellow', 'green', 'purple', 'blue', 'black']
  7. # 数据计算处理
  8. sizes = [data[0] / Num * 100, data[1] / Num * 100, data[2] / Num * 100, data[3] / Num * 100, data[4] / Num * 100,
  9. data[5] / Num * 100, data[6] / Num * 100]
  10. # 设置突出模块偏移值
  11. expodes = (0, 0, 0.1, 0, 0, 0, 0)
  12. # 设置绘图属性并绘图
  13. plt.pie(sizes, explode=expodes, labels=labels, shadow=True, colors=colors)
  14. ## 用于显示为一个长宽相等的饼图
  15. plt.axis('equal')
  16. # 保存并显示
  17. # plt.savefig('picture/step3/fig3.png')
  18. plt.show()

5、百分比堆积图

  1. import numpy as np
  2. import pandas as pd
  3. import matplotlib.pyplot as plt
  4. import matplotlib.patches as mpatches
  5. from matplotlib.ticker import PercentFormatter
  6. # 假设 df 已经被正确加载,这里只是一个示例
  7. # df = pd.read_csv('your_data.csv') # 读取数据
  8. # 示例数据(用于演示)
  9. df = pd.DataFrame({
  10. 'Category': ['A', 'B', 'C', 'D', 'E'],
  11. 'Fair': [10, 20, 30, 40, 50],
  12. 'Good': [20, 30, 40, 50, 60],
  13. 'Very Good': [30, 40, 50, 60, 70],
  14. 'Premium': [40, 50, 60, 70, 80],
  15. 'Ideal': [50, 60, 70, 80, 90]
  16. })
  17. # 设置填充的颜色
  18. colors = ['#ADFEDC', '#4EFEB3', '#02F78E', '#02CB74', '#019858']
  19. labels = df.columns[1:].tolist() # 获取列标签
  20. # 获取处理数据
  21. y_values = df.iloc[0:5, 1:].values # 获取所有行的数据(这里只取前四行作为示例)
  22. data = y_values.T # 转置数组,使得每个类别的数据成为一个列
  23. x = range(len(labels)) # x轴标签
  24. bottom_y = np.zeros(len(labels)) # 初始化底部y值为0
  25. # 绘制堆积柱状图
  26. figure, ax = plt.subplots()
  27. for i, color in enumerate(colors):
  28. y = data[i] / data[i].sum() # 计算百分比
  29. ax.bar(x, y, width=0.5, color=color, bottom=bottom_y, edgecolor='gray', label=labels[i])
  30. bottom_y += y # 更新底部y值以进行堆积
  31. # 设置x轴标签
  32. ax.set_xticks(x)
  33. ax.set_xticklabels(labels)
  34. # 设置图例
  35. legend_labels = ['Fair', 'Good', 'Very Good', 'Premium', 'Ideal']
  36. patches = [mpatches.Patch(color=color, label=label) for color, label in zip(colors, legend_labels)]
  37. ax.legend(handles=patches, ncol=1, loc='upper right') # 将图例放在右上角
  38. # 设置y轴为百分比格式
  39. ax.yaxis.set_major_formatter(PercentFormatter(1))
  40. # 绘制平行于x轴的虚线
  41. for i in range(1, 11):
  42. ax.axhline(y=i / 10, linestyle='dashed', color='black', linewidth=0.5)
  43. # 设置标题和轴标签
  44. plt.rcParams['font.sans-serif'] = ['SimHei',]
  45. ax.set_title('百分比堆积柱状图', fontsize=13)
  46. ax.set_ylabel('百分比', fontsize=13) # 修改ylabel为百分比
  47. ax.set_xlabel('类别', fontsize=13) # 修改xlabel为中文
  48. # 显示图形
  49. plt.show()
'
运行

6、热力图

  1. import numpy as np
  2. import pandas as pd
  3. import seaborn as sns
  4. from matplotlib import pyplot as plt
  5. a=pd.read_csv(r"C:\Users\ASUS\Desktop\ong-customer-train.csv")
  6. a.drop(a[a["Age"].str.contains("-")].index,inplace=True)
  7. a=a.drop(a[a["Age"]=="0"].index)
  8. a["Age"]=a["Age"].str.replace("岁","")
  9. a["Age"]=a["Age"].str.replace(" 岁","")
  10. # y轴含义
  11. new_a=a[["CreditScore","Age","Tenure","Balance","NumOfProducts","EstimatedSalary"]]
  12. # 数据
  13. data=new_a.corr().round(4)
  14. plt.figure(figsize=(8, 6))
  15. sns.heatmap(data,
  16. annot=True, #显示数值
  17. cmap='PuBuGn', #色块颜色
  18. linewidths=1,
  19. linecolor='black',
  20. )
  21. plt.title('Correlation Heatmap') #标题
  22. plt.show()

7、箱型图

  1. sns.boxplot(x=insurance.smoker, y=insurance.charges, order=['no', 'yes'])
  2. plt.show()

二、高级绘图

1、判断相关性

  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. import pandas as pd
  4. import seaborn as sns
  5. import matplotlib as mpl
  6. import warnings
  7. warnings.filterwarnings("ignore")
  8. mpl.rcParams.update(mpl.rcParamsDefault)
  9. sns.set_style("white")
  10. fish = pd.read_csv('Fish.csv')
  11. print(fish.head())
  12. fish1 = fish[fish['Species'].isin(['Bream', 'Perch', 'Pike'])] #选取鱼的种类
  13. # sns.pairplot(fish1, hue='Species')
  14. # plt.show()
  15. #设置主题(palette)
  16. sns.pairplot(fish1, hue='Species', palette='husl', size=2)
  17. plt.show()

若只想选取某一部分的数据:

  1. sns.pairplot(fish1, hue='Species', vars=['Length1', 'Width', 'Height', 'Weight'],
  2. height=3, aspect=1)
  3. plt.show()

由于该图较为抽象,现给出数据集预览:

2、回归拟合图

  1. sns.regplot(x=fish1.Weight, y=fish1.Height, color='#FF6600', marker='>')
  2. plt.show()

若使用log拟合,只需修改默认log参数即可:

  1. sns.regplot(x=fish1.Weight, y=fish1.Height, color='#FF6600', logx=True)
  2. plt.show()

修改图形样式:

  1. sns.regplot(x=fish1.Weight, y=fish1.Height, logx=True, line_kws={'color':'#FF5722', 'alpha':0.8, 'lw':3})
  2. plt.show()

若想拟合多条

  1. sns.lmplot(x='bmi', y='charges', hue='smoker', data=insurance, height=8, aspect=1.2)
  2. plt.show()

(引入了一个insurance 的数据)

3、小提琴图

  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. import pandas as pd
  4. import seaborn as sns
  5. import matplotlib as mpl
  6. import warnings
  7. warnings.filterwarnings("ignore")
  8. # Recover default matplotlib settings
  9. mpl.rcParams.update(mpl.rcParamsDefault)
  10. sns.set_style("white")
  11. employment = pd.read_excel("unemployment.xlsx")
  12. sns.violinplot(x=employment.Age, y=employment.Unemployed, hue=employment.Gender, palette='Set2')
  13. plt.show()

若要重叠两图,可以修改dodge参数,使其为False

  1. sns.violinplot(x=employment.Age, y=employment.Unemployed, hue=employment.Gender, palette='Set2', dodge=False)
  2. plt.show()

4、折线图(seaborn)

lineplot参数解释

  1. sns.lineplot(x='Period', y='Unemployed', hue='Gender', style='Gender',data=employment,
  2. dashes=False, palette='CMRmap', markers=['o', '>'])
x='Period':指定 x 轴的数据列为 "Period"。
y='Unemployed':指定 y 轴的数据列为 "Unemployed"。
hue='Gender':根据 "Gender" 列进行分组,并使用不同的颜色来表示不同的分组。
style='Gender':根据 "Gender" 列进行分组,并使用不同的标记样式来表示不同的分组。
markers=True:显示每个数据点的标记。
dashes=False:不使用虚线样式绘制折线。
data=employment:指定要使用的数据集为 employment。
err_style='bars':指定误差线的样式为条形图形式。
ci=70:设置置信区间为 70%,用于计算误差线的范围。
palette 参数指定了使用哪种调色板来着色
markers 参数指定了使用哪些标记

背景设置

plt.style.use('seaborn-darkgrid') #设置背景
"seaborn-whitegrid":与 "seaborn-darkgrid" 类似,但背景为白色。
"ggplot":仿照 R 语言中的 ggplot2 包的风格,带有灰色背景和更突出的轴线。
"fivethirtyeight":模仿知名新闻网站 FiveThirtyEight 的风格,专注于数据可视化。
"bmh":较为简洁的风格,适用于科学绘图。

pattle参数(调色板)类型

'deep':深色调色板
'muted':柔和色调调色板
'bright':鲜亮色调调色板
'pastel':柔和的亮色调色板
'dark':深色调色板
'colorblind':适合色盲人士的调色板

设置标题文字大小,颜色

plt.gcf().text(.2, .84, 'GENDER', fontsize=40, color='Black')

综合效果

  1. plt.figure(figsize=(14, 7))
  2. plt.style.use('ggplot')
  3. plt.gcf().text(.2, .84, 'GENDER', fontsize=40, color='Black')
  4. sns.set(rc={'xtick.labelsize':17,'ytick.labelsize':10,'axes.labelsize':15, 'axes.grid':False})
  5. sns.lineplot(x='Period', y='Unemployed', hue='Gender', style='Gender',data=employment,
  6. dashes=False, palette='CMRmap', err_style='bars', ci=70, markers=['o', '>'])
  7. plt.show()

5、散点&线性分布图

relplot参数解释

  1. sns.relplot(x='Period', y='Unemployed', hue='Gender', col='Age', kind='line',
  2. data=employment, height=6, aspect=1, col_wrap=4, linewidth=2)
hue='smoker':通过颜色来区分不同的类别,这里使用 'smoker' 表示是否吸烟。
data=insurance:指定要使用的数据集,这里使用名为 'insurance' 的数据集。
height=8:设置图形的高度为 8 英寸。
aspect=1:设置图形的纵横比为 1。
col: 使用不同的列值将数据分成多个子图列
kind: 指定要绘制的关系图的类型。line就是线型图
col_wrap: 指定每行的子图数量。在这里,我们设置为 4,表示每行显示 4 个子图。
linewidth: 指定线的宽度

散点

  1. sns.relplot(x='bmi', y='charges', hue='sex', col='sex', row='region',
  2. data=insurance, height=7, aspect=.6)
  3. plt.show()

线性分布

  1. sns.relplot(x='Period', y='Unemployed', hue='Gender', col='Age', kind='line',
  2. data=employment, height=6, aspect=1, col_wrap=4, linewidth=2)
  3. plt.show()

6、核密度分布图

1)二维核密度图

先导入所需的库以及数据

  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. import pandas as pd
  4. import seaborn as sns
  5. import matplotlib as mpl
  6. import warnings
  7. import plotly.graph_objs as go
  8. warnings.filterwarnings("ignore")
  9. insurance = pd.read_csv('insurance.csv')
kdeplot参数解释
sns.kdeplot(x=insurance.bmi, y=insurance.charges, shade=True, cmap='Reds', shade_lowest=False)
cmap='Reds'指定了使用红色系的颜色映射
shade=True表示将估计结果映射为密度颜色
shade_lowest=True 会将密度估计图(Kernel Density Estimation Plot)中最低的区域进行阴影处理
  1. plt.figure(figsize=(6, 8))
  2. sns.kdeplot(x=insurance.bmi, y=insurance.charges, shade=True, cmap='Reds', shade_lowest=True)
  3. plt.show()

swarmplot分布散点图
  1. plt.figure(figsize=(7,7))
  2. sns.swarmplot(x=insurance.smoker, y=insurance.charges)
  3. plt.show()

2)更美观的核密度分布图

【1】

  1. my_dpi = 96
  2. plt.figure(figsize=(480 / my_dpi, 480 / my_dpi), dpi=my_dpi)
  3. sns.jointplot(x=insurance["bmi"], y=insurance["charges"])
  4. plt.show()

【2】

  1. my_dpi=96
  2. plt.figure(figsize=(480/my_dpi, 480/my_dpi), dpi=my_dpi)
  3. sns.jointplot(x=insurance["bmi"], y=insurance["charges"], kind='hex')
  4. plt.show()

【3】

  1. my_dpi=96
  2. plt.figure(figsize=(480/my_dpi, 480/my_dpi), dpi=my_dpi)
  3. sns.jointplot(x=insurance["bmi"], y=insurance["charges"], kind='kde')
  4. plt.show()

【4】

  1. my_dpi=96
  2. plt.figure(figsize=(480/my_dpi, 480/my_dpi), dpi=my_dpi)
  3. plt.hist2d(x=insurance["bmi"], y=insurance["charges"], bins=(300, 300), cmap=plt.cm.jet)
  4. plt.gca()
  5. plt.show()

集中分布时:

【5】

  1. my_dpi=96
  2. plt.figure(figsize=(480/my_dpi, 480/my_dpi), dpi=my_dpi)
  3. plt.hist2d(x=insurance["bmi"], y=insurance["charges"], bins=(300, 30), cmap=plt.cm.jet)
  4. plt.gca()
  5. plt.show()

3)三维核密度图

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. from mpl_toolkits.mplot3d import Axes3D
  4. x = insurance['age'].values
  5. y = insurance['bmi'].values
  6. z = insurance['charges'].values
  7. # 计算核密度估计
  8. density, x_edges, y_edges = np.histogram2d(x, y, bins=50, density=True)
  9. density /= density.sum()
  10. # 创建网格坐标
  11. x_grid, y_grid = np.meshgrid(x_edges[:-1], y_edges[:-1])
  12. # 绘制三维核密度图
  13. fig = plt.figure()
  14. ax = fig.add_subplot(111, projection='3d')
  15. ax.plot_surface(x_grid, y_grid, density, cmap='viridis')
  16. ax.set_xlabel('age')
  17. ax.set_ylabel('bmi')
  18. ax.set_zlabel('charges')
  19. plt.show()

在此基础上再画一个灰度图:

  1. # 计算灰度值
  2. gray_values = density.sum(axis=1) # 沿y轴方向进行求和,得到灰度值
  3. # 绘制灰度图
  4. fig2 = plt.figure()
  5. ax2 = fig2.add_subplot(111, projection='3d')
  6. X, Y = np.meshgrid(y_edges[:-1], x_edges[:-1])
  7. ax2.plot_surface(X, Y, np.outer(gray_values, np.ones_like(y_edges[:-1])), cmap='gray')
  8. ax2.set_xlabel('bmi')
  9. ax2.set_ylabel('age')
  10. ax2.set_zlabel('gray values')
  11. plt.show()

除此之外,还能加入散点元素,使得数据更为直观地分布在空间中

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. from mpl_toolkits.mplot3d import Axes3D
  4. x = insurance['age'].values
  5. y = insurance['bmi'].values
  6. z = insurance['charges'].values
  7. # 计算核密度估计
  8. density, x_edges, y_edges = np.histogram2d(x, y, bins=50, density=True)
  9. density /= density.sum()
  10. fig = plt.figure()
  11. ax = fig.add_subplot(111, projection='3d')
  12. # 绘制三维地形图
  13. X, Y = np.meshgrid(x_edges[:-1], y_edges[:-1])
  14. Z = density.T
  15. ax.plot_surface(X, Y, Z, cmap='terrain', rstride=1, cstride=1)
  16. # 添加散点图
  17. ax.scatter(x, y, z, cmap='viridis', s=5)
  18. ax.set_xlabel('age')
  19. ax.set_ylabel('bmi')
  20. ax.set_zlabel('charges')
  21. ax.set_title('3D Terrain Map')
  22. plt.show()

7、直方分布图

  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. import pandas as pd
  4. import seaborn as sns
  5. import matplotlib as mpl
  6. import warnings
  7. warnings.filterwarnings("ignore")
  8. # Recover default matplotlib settings
  9. mpl.rcParams.update(mpl.rcParamsDefault)
  10. # 参数解释:
  11. # kde:是否显示核密度曲线
  12. fig1 , axes = plt.subplots(nrows=3,ncols=3 , figsize = (20,20))
  13. sns.distplot( housing["longitude"] , ax=axes[0, 0])
  14. sns.distplot( housing["latitude"] , ax=axes[0, 1])
  15. sns.distplot( housing["housing_median_age"] , ax=axes[0, 2])
  16. sns.distplot( housing["total_rooms"], ax=axes[1, 0] )
  17. sns.distplot( housing["population"] , ax=axes[1, 1] )
  18. sns.distplot( housing["households"] , ax=axes[1, 2] )
  19. sns.distplot( housing["median_income"] , ax=axes[2, 0])
  20. sns.distplot( housing["median_house_value"], ax=axes[2, 1])
  21. sns.distplot( housing["median_house_value"], ax=axes[2, 2])
  22. plt.show()

美化,并且删除曲线以后:

  1. fig1 , axes = plt.subplots(nrows=3,ncols=3 , figsize = (20,20))
  2. sns.distplot( housing["longitude"] , color="#00bcd4", ax=axes[0, 0] , kde=False , bins=20)
  3. sns.distplot( housing["latitude"] , color="#937d14", ax=axes[0, 1] , kde=False,bins=20)
  4. sns.distplot( housing["housing_median_age"] , color="#006600", ax=axes[0, 2],kde=False,bins=20)
  5. sns.distplot( housing["total_rooms"] , color="#ff1e56", ax=axes[1, 0] , kde=False,bins=20)
  6. sns.distplot( housing["population"] , color="#216353", ax=axes[1, 1] , kde=False,bins=20)
  7. sns.distplot( housing["households"] , color="#FF8F00", ax=axes[1, 2] , kde=False,bins=20)
  8. sns.distplot( housing["median_income"] , color="#33FF00", ax=axes[2, 0] , kde=False,bins=20)
  9. sns.distplot( housing["median_house_value"] , color="#FF3300", ax=axes[2, 1], kde=False,bins=20)
  10. sns.distplot( housing["median_house_value"] , color="#CCCC00", ax=axes[2, 2] , kde=False,bins=20)
  11. plt.show()

声明:

1、本文数据来源于网络与个人的竞赛经历

2、本文仅限于各种绘图的代码与示例,不涉及每种图的使用场景及其代码写作方法

3、如需使用,可以直接复制代码,修改数据即可

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号