这40个Python可视化图表案例,强烈建议收藏! |
您所在的位置:网站首页 › 信息可视化对比图 › 这40个Python可视化图表案例,强烈建议收藏! |
来源:法纳斯特 大家好,我是阳哥。 数据可视化是数据科学中关键的一步。 在以图形方式表现某些数据时,Python能够提供很大的帮助。 不过有些小伙伴也会遇到不少问题,比如选择何种图表,以及如何制作,代码如何编写,这些都是问题! 今天给大家介绍一个Python图表大全,40个种类,总计约400个示例图表。 分为7个大系列,分布、关系、排行、局部整体、时间序列、地理空间、流程。 文档地址 https://www.python-graph-gallery.com GitHub地址 https://github.com/holtzy/The-Python-Graph-Gallery 给大家提供了示例及代码,几分钟内就能构建一个你所需要的图表。 下面就给大家介绍一下~ 01. 小提琴图 小提琴图可以将一组或多组数据的数值变量分布可视化。 相比有时会隐藏数据特征的箱形图相比,小提琴图值得更多关注。 import seaborn as sns import matplotlib.pyplot as plt # 加载数据 df = sns.load_dataset('iris', data_home='seaborn-data', cache=True) # 绘图显示 sns.violinplot(x=df["species"], y=df["sepal_length"]) plt.show()使用Seaborn的violinplot()进行绘制,结果如下。 02. 核密度估计图 核密度估计图其实是对直方图的一个自然拓展。 可以可视化一个或多个组的数值变量的分布,非常适合大型数据集。 import seaborn as sns import matplotlib.pyplot as plt # 加载数据 df = sns.load_dataset('iris', data_home='seaborn-data', cache=True) # 绘图显示 sns.kdeplot(df['sepal_width']) plt.show()使用Seaborn的kdeplot()进行绘制,结果如下。 03. 直方图 直方图,可视化一组或多组数据的分布情况。 import seaborn as sns import matplotlib.pyplot as plt # 加载数据 df = sns.load_dataset('iris', data_home='seaborn-data', cache=True) # 绘图显示 sns.distplot(a=df["sepal_length"], hist=True, kde=False, rug=False) plt.show()使用Seaborn的distplot()进行绘制,结果如下。 04. 箱形图 箱形图,可视化一组或多组数据的分布情况。 可以快速获得中位数、四分位数和异常值,但也隐藏数据集的各个数据点。 import seaborn as sns import matplotlib.pyplot as plt # 加载数据 df = sns.load_dataset('iris', data_home='seaborn-data', cache=True) # 绘图显示 sns.boxplot(x=df["species"], y=df["sepal_length"]) plt.show()使用Seaborn的boxplot()进行绘制,结果如下。 05. 山脊线图 山脊线图,总结几组数据的分布情况。 每个组都表示为一个密度图,每个密度图相互重叠以更有效地利用空间。 import plotly.graph_objects as go import numpy as np import pandas as pd # 读取数据 temp = pd.read_csv('2016-weather-data-seattle.csv') # 数据处理, 时间格式转换 temp['year'] = pd.to_datetime(temp['Date']).dt.year # 选择几年的数据展示即可 year_list = [1950, 1960, 1970, 1980, 1990, 2000, 2010] temp = temp[temp['year'].isin(year_list)] # 绘制每年的直方图,以年和平均温度分组,并使用'count'函数进行汇总 temp = temp.groupby(['year', 'Mean_TemperatureC']).agg({'Mean_TemperatureC': 'count'}).rename(columns={'Mean_TemperatureC': 'count'}).reset_index() # 使用Plotly绘制脊线图,每个轨迹对应于特定年份的温度分布 # 将每年的数据(温度和它们各自的计数)存储在单独的数组,并将其存储在字典中以方便检索 array_dict = {} for year in year_list: # 每年平均温度 array_dict[f'x_{year}'] = temp[temp['year'] == year]['Mean_TemperatureC'] # 每年温度计数 array_dict[f'y_{year}'] = temp[temp['year'] == year]['count'] array_dict[f'y_{year}'] = (array_dict[f'y_{year}'] - array_dict[f'y_{year}'].min()) \ / (array_dict[f'y_{year}'].max() - array_dict[f'y_{year}'].min()) # 创建一个图像对象 fig = go.Figure() for index, year in enumerate(year_list): # 使用add_trace()绘制轨迹 fig.add_trace(go.Scatter( x=[-20, 40], y=np.full(2, len(year_list) - index), mode='lines', line_color='white')) fig.add_trace(go.Scatter( x=array_dict[f'x_{year}'], y=array_dict[f'y_{year}'] + (len(year_list) - index) + 0.4, fill='tonexty', name=f'{year}')) # 添加文本 fig.add_annotation( x=-20, y=len(year_list) - index, text=f'{year}', showarrow=False, yshift=10) # 添加标题、图例、xy轴参数 fig.update_layout( title='1950年~2010年西雅图平均温度', showlegend=False, xaxis=dict(title='单位: 摄氏度'), yaxis=dict(showticklabels=False) ) # 跳转网页显示 fig.show()Seaborn没有专门的函数来绘制山脊线图,可以多次调用kdeplot()来制作。 结果如下。 06. 散点图 散点图,显示2个数值变量之间的关系。 import seaborn as sns import matplotlib.pyplot as plt # 加载数据 df = sns.load_dataset('iris', data_home='seaborn-data', cache=True) # 绘图显示 sns.regplot(x=df["sepal_length"], y=df["sepal_width"]) plt.show()使用Seaborn的regplot()进行绘制,结果如下。 07. 矩形热力图 矩形热力图,矩阵中的每个值都被表示为一个颜色数据。 import seaborn as sns import pandas as pd import numpy as np # Create a dataset df = pd.DataFrame(np.random.random((5,5)), columns=["a","b","c","d","e"]) # Default heatmap p1 = sns.heatmap(df)使用Seaborn的heatmap()进行绘制,结果如下。 08. 相关性图 相关性图或相关矩阵图,分析每对数据变量之间的关系。 相关性可视化为散点图,对角线用直方图或密度图表示每个变量的分布。 import seaborn as sns import matplotlib.pyplot as plt # 加载数据 df = sns.load_dataset('iris', data_home='seaborn-data', cache=True) # 绘图显示 sns.pairplot(df) plt.show()使用Seaborn的pairplot()进行绘制,结果如下。 09. 气泡图 气泡图其实就是一个散点图,其中圆圈大小被映射到第三数值变量的值。 import matplotlib.pyplot as plt import seaborn as sns from gapminder import gapminder # 导入数据 data = gapminder.loc[gapminder.year == 2007] # 使用scatterplot创建气泡图 sns.scatterplot(data=data, x="gdpPercap", y="lifeExp", size="pop", legend=False, sizes=(20, 2000)) # 显示 plt.show()使用Seaborn的scatterplot()进行绘制,结果如下。 10. 连接散点图 连接散点图就是一个线图,其中每个数据点由圆形或任何类型的标记展示。 import matplotlib.pyplot as plt import numpy as np import pandas as pd # 创建数据 df = pd.DataFrame({'x_axis': range(1, 10), 'y_axis': np.random.randn(9) * 80 + range(1, 10)}) # 绘制显示 plt.plot('x_axis', 'y_axis', data=df, linestyle='-', marker='o') plt.show()使用Matplotlib的plot()进行绘制,结果如下。 11. 二维密度图 二维密度图或二维直方图,可视化两个定量变量的组合分布。 它们总是在X轴上表示一个变量,另一个在Y轴上,就像散点图。 然后计算二维空间特定区域内的次数,并用颜色渐变表示。 形状变化:六边形a hexbin chart,正方形a 2d histogram,核密度2d density plots或contour plots。 import numpy as np import matplotlib.pyplot as plt from scipy.stats import kde # 创建数据, 200个点 data = np.random.multivariate_normal([0, 0], [[1, 0.5], [0.5, 3]], 200) x, y = data.T # 创建画布, 6个子图 fig, axes = plt.subplots(ncols=6, nrows=1, figsize=(21, 5)) # 第一个子图, 散点图 axes[0].set_title('Scatterplot') axes[0].plot(x, y, 'ko') # 第二个子图, 六边形 nbins = 20 axes[1].set_title('Hexbin') axes[1].hexbin(x, y, gridsize=nbins, cmap=plt.cm.BuGn_r) # 2D 直方图 axes[2].set_title('2D Histogram') axes[2].hist2d(x, y, bins=nbins, cmap=plt.cm.BuGn_r) # 高斯kde k = kde.gaussian_kde(data.T) xi, yi = np.mgrid[x.min():x.max():nbins * 1j, y.min():y.max():nbins * 1j] zi = k(np.vstack([xi.flatten(), yi.flatten()])) # 密度图 axes[3].set_title('Calculate Gaussian KDE') axes[3].pcolormesh(xi, yi, zi.reshape(xi.shape), shading='auto', cmap=plt.cm.BuGn_r) # 添加阴影 axes[4].set_title('2D Density with shading') axes[4].pcolormesh(xi, yi, zi.reshape(xi.shape), shading='gouraud', cmap=plt.cm.BuGn_r) # 添加轮廓 axes[5].set_title('Contour') axes[5].pcolormesh(xi, yi, zi.reshape(xi.shape), shading='gouraud', cmap=plt.cm.BuGn_r) axes[5].contour(xi, yi, zi.reshape(xi.shape)) plt.show()使用Matplotlib和scipy进行绘制,结果如下。 12. 条形图 条形图表示多个明确的变量的数值关系。每个变量都为一个条形。条形的大小代表其数值。 import numpy as np import matplotlib.pyplot as plt # 生成随机数据 height = [3, 12, 5, 18, 45] bars = ('A', 'B', 'C', 'D', 'E') y_pos = np.arange(len(bars)) # 创建条形图 plt.bar(y_pos, height) # x轴标签 plt.xticks(y_pos, bars) # 显示 plt.show()使用Matplotlib的bar()进行绘制,结果如下。 13. 雷达图 雷达图,可以可视化多个定量变量的一个或多个系列的值。 每个变量都有自己的轴,所有轴都连接在图形的中心。 import matplotlib.pyplot as plt import pandas as pd from math import pi # 设置数据 df = pd.DataFrame({ 'group': ['A', 'B', 'C', 'D'], 'var1': [38, 1.5, 30, 4], 'var2': [29, 10, 9, 34], 'var3': [8, 39, 23, 24], 'var4': [7, 31, 33, 14], 'var5': [28, 15, 32, 14] }) # 目标数量 categories = list(df)[1:] N = len(categories) # 角度 angles = [n / float(N) * 2 * pi for n in range(N)] angles += angles[:1] # 初始化 ax = plt.subplot(111, polar=True) # 设置第一处 ax.set_theta_offset(pi / 2) ax.set_theta_direction(-1) # 添加背景信息 plt.xticks(angles[:-1], categories) ax.set_rlabel_position(0) plt.yticks([10, 20, 30], ["10", "20", "30"], color="grey", size=7) plt.ylim(0, 40) # 添加数据图 # 第一个 values = df.loc[0].drop('group').values.flatten().tolist() values += values[:1] ax.plot(angles, values, linewidth=1, linestyle='solid', label="group A") ax.fill(angles, values, 'b', alpha=0.1) # 第二个 values = df.loc[1].drop('group').values.flatten().tolist() values += values[:1] ax.plot(angles, values, linewidth=1, linestyle='solid', label="group B") ax.fill(angles, values, 'r', alpha=0.1) # 添加图例 plt.legend(loc='upper right', bbox_to_anchor=(0.1, 0.1)) # 显示 plt.show()使用Matplotlib进行绘制,结果如下。 14. 词云图 词云图是文本数据的视觉表示。 单词通常是单个的,每个单词的重要性以字体大小或颜色表示。 from wordcloud import WordCloud import matplotlib.pyplot as plt # 添加词语 text=("Python Python Python Matplotlib Chart Wordcloud Boxplot") # 创建词云对象 wordcloud = WordCloud(width=480, height=480, margin=0).generate(text) # 显示词云图 plt.imshow(wordcloud, interpolation='bilinear') plt.axis("off") plt.margins(x=0, y=0) plt.show()使用wordcloud进行绘制,结果如下。 15. 平行座标图 一个平行座标图,能够比较不同系列相同属性的数值情况。 Pandas可能是绘制平行坐标图的最佳方式。 import seaborn as sns import matplotlib.pyplot as plt from pandas.plotting import parallel_coordinates # 读取数据 data = sns.load_dataset('iris', data_home='seaborn-data', cache=True) # 创建图表 parallel_coordinates(data, 'species', colormap=plt.get_cmap("Set2")) # 显示 plt.show()使用Pandas的parallel_coordinates()进行绘制,结果如下。 16. 棒棒糖图 棒棒糖图其实就是柱状图的变形,显示一个线段和一个圆。 import matplotlib.pyplot as plt import pandas as pd import numpy as np # 创建数据 df = pd.DataFrame({'group': list(map(chr, range(65, 85))), 'values': np.random.uniform(size=20) }) # 排序取值 ordered_df = df.sort_values(by='values') my_range = range(1, len(df.index)+1) # 创建图表 plt.stem(ordered_df['values']) plt.xticks(my_range, ordered_df['group']) # 显示 plt.show()使用Matplotlib的stem()进行绘制,结果如下。 17. 径向柱图 径向柱图同样也是条形图的变形,但是使用极坐标而不是直角坐标系。 绘制起来有点麻烦,而且比柱状图准确度低,但更引人注目。 import pandas as pd import matplotlib.pyplot as plt import numpy as np # 生成数据 df = pd.DataFrame( { 'Name': ['item ' + str(i) for i in list(range(1, 51)) ], 'Value': np.random.randint(low=10, high=100, size=50) }) # 排序 df = df.sort_values(by=['Value']) # 初始化画布 plt.figure(figsize=(20, 10)) ax = plt.subplot(111, polar=True) plt.axis('off') # 设置图表参数 upperLimit = 100 lowerLimit = 30 labelPadding = 4 # 计算最大值 max = df['Value'].max() # 数据下限10, 上限100 slope = (max - lowerLimit) / max heights = slope * df.Value + lowerLimit # 计算条形图的宽度 width = 2*np.pi / len(df.index) # 计算角度 indexes = list(range(1, len(df.index)+1)) angles = [element * width for element in indexes] # 绘制条形图 bars = ax.bar( x=angles, height=heights, width=width, bottom=lowerLimit, linewidth=2, edgecolor="white", color="#61a4b2", ) # 添加标签 for bar, angle, height, label in zip(bars,angles, heights, df["Name"]): # 旋转 rotation = np.rad2deg(angle) # 翻转 alignment = "" if angle >= np.pi/2 and angle 0.8) & (links['var1'] != links['var2'])] # 生成图 G = nx.from_pandas_edgelist(links_filtered, 'var1', 'var2') # 绘制网络 nx.draw(G, with_labels=True, node_color='orange', node_size=400, edge_color='black', linewidths=1, font_size=15) # 显示 plt.show()使用NetworkX库进行绘制,结果如下。 37. 桑基图 桑基图是一种特殊的流图。 它主要用来表示原材料、能量等如何从初始形式经过中间过程的加工、转化到达最终形式。 Plotly可能是创建桑基图的最佳工具,通过Sankey()在几行代码中获得一个图表。 import plotly.graph_objects as go import json # 读取数据 with open('sankey_energy.json') as f: data = json.load(f) # 透明度 opacity = 0.4 # 颜色 data['data'][0]['node']['color'] = ['rgba(255,0,255, 0.8)' if color == "magenta" else color for color in data['data'][0]['node']['color']] data['data'][0]['link']['color'] = [data['data'][0]['node']['color'][src].replace("0.8", str(opacity)) for src in data['data'][0]['link']['source']] fig = go.Figure(data=[go.Sankey( valueformat=".0f", valuesuffix="TWh", # 点 node=dict( pad=15, thickness=15, line=dict(color = "black", width = 0.5), label=data['data'][0]['node']['label'], color=data['data'][0]['node']['color'] ), # 线 link=dict( source=data['data'][0]['link']['source'], target=data['data'][0]['link']['target'], value=data['data'][0]['link']['value'], label=data['data'][0]['link']['label'], color=data['data'][0]['link']['color'] ))]) fig.update_layout(title_text="Energy forecast for 2050Source: Department of Energy & Climate Change, Tom Counsell via Mike Bostock", font_size=10) # 保持 fig.write_html("sankey-diagram.html")使用Plotly库进行绘制,结果如下。 38. 弧线图 弧线图是一种特殊的网络图。 由代表实体的节点和显示实体之间关系的弧线组成的。 在弧线图中,节点沿单个轴显示,节点间通过圆弧线进行连接。 目前还不知道如何通过Python来构建弧线图,不过可以使用R或者D3.js。 下面就来看一个通过js生成的弧线图。 39. 环形布局关系图 可视化目标之间的关系,可以减少复杂网络下观察混乱。 和弧线图一样,也只能通R或者D3.js绘制。 D3.js绘制的示例如下。 40. 动态图表 动态图表本质上就是显示一系列静态图表。 可以描述目标从一种状态到另一种状态的变化。 import imageio import pandas as pd import matplotlib.pyplot as plt # 读取数据 data = pd.read_csv('gapminderData.csv') # 更改格式 data['continent'] = pd.Categorical(data['continent']) # 分辨率 dpi = 96 filenames = [] # 每年的数据 for i in data.year.unique(): # 关闭交互式绘图 plt.ioff() # 初始化 fig = plt.figure(figsize=(680 / dpi, 480 / dpi), dpi=dpi) # 筛选数据 subsetData = data[data.year == i] # 生成散点气泡图 plt.scatter( x=subsetData['lifeExp'], y=subsetData['gdpPercap'], s=subsetData['pop'] / 200000, c=subsetData['continent'].cat.codes, cmap="Accent", alpha=0.6, edgecolors="white", linewidth=2) # 添加相关信息 plt.yscale('log') plt.xlabel("Life Expectancy") plt.ylabel("GDP per Capita") plt.title("Year: " + str(i)) plt.ylim(0, 100000) plt.xlim(30, 90) # 保存 filename = './images/' + str(i) + '.png' filenames.append(filename) plt.savefig(fname=filename, dpi=96) plt.gca() plt.close(fig) # 生成GIF动态图表 with imageio.get_writer('result.gif', mode='I', fps=5) as writer: for filename in filenames: image = imageio.imread(filename) writer.append_data(image)以一个动态散点气泡图为例, 先用matplotlib绘制图表图片,再通过imageio生成GIF,结果如下。 好了,本期的分享就到此结束了。 其中使用到的可视化库,大部分通过pip install即可完成安装。 相关代码及文件已上传,回复「20210921」即可获取。 有兴趣的小伙伴,可以自行去实践学习一下! ---------End--------- 精选资料回复关键词,获取对应的资料: 关键词资料名称600《Python知识手册》md《Markdown速查表》time《Python时间使用指南》str《Python字符串速查表》pip《Python:Pip速查表》style《Pandas表格样式配置指南》mat《Matplotlib入门100个案例》px《Plotly Express可视化指南》 精选内容神器 VS Code,超详细Python配置使用指南 神器Tushare,财经数据必备工具! Matplotlib 可视化最有价值的 50 个图表 视频:Plotly 和 Dash 在投资领域的应用 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |