首页 > 解决方案 > 使用 matplotlib 和 seaborn 创建圆形密度图

问题描述

我正在尝试创建下面两个图像的组合。

密度图

圆形条形图

基本上我想要密度图的设计,但围绕一个圆圈而不是正常的 X/Y 图表设置。

下面是 Python 中密度图的代码。

    # !pip install brewer2mpl
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns
import warnings; warnings.filterwarnings(action='once')

large = 22; med = 16; small = 12
params = {'axes.titlesize': large,
          'legend.fontsize': med,
          'figure.figsize': (16, 10),
          'axes.labelsize': med,
          'axes.titlesize': med,
          'xtick.labelsize': med,
          'ytick.labelsize': med,
          'figure.titlesize': large}
plt.rcParams.update(params)
plt.style.use('seaborn-whitegrid')
sns.set_style("white")
#%matplotlib inline

# Version
print(mpl.__version__)  #> 3.0.0
print(sns.__version__)  #> 0.9.0

# Import Data
df = pd.read_csv("https://github.com/selva86/datasets/raw/master/mpg_ggplot2.csv")

# Draw Plot
plt.figure(figsize=(16,10), dpi= 80)
sns.kdeplot(df.loc[df['cyl'] == 4, "cty"], shade=True, color="g", label="Cyl=4", alpha=.7)
sns.kdeplot(df.loc[df['cyl'] == 5, "cty"], shade=True, color="deeppink", label="Cyl=5", alpha=.7)
sns.kdeplot(df.loc[df['cyl'] == 6, "cty"], shade=True, color="dodgerblue", label="Cyl=6", alpha=.7)
sns.kdeplot(df.loc[df['cyl'] == 8, "cty"], shade=True, color="orange", label="Cyl=8", alpha=.7)

# Decoration
plt.title('Density Plot of City Mileage by n_Cylinders', fontsize=22)
plt.legend()
plt.show()

这是圆形条形图的代码。

    import numpy as np
import matplotlib.pyplot as plt

#~~~~~~~~~~~Test~~~~~~~#
import pandas as pd
import seaborn as sns
# Import Data
df = pd.read_csv("https://github.com/selva86/datasets/raw/master/mpg_ggplot2.csv")
#~~~~~~~~~~~Test~~~~~~~#

N = 80
bottom = 8
max_height = 4

theta = np.linspace(0.0, 2 * np.pi, N, endpoint=False)
radii = max_height*np.random.rand(N)
width = (2*np.pi) / N

ax = plt.subplot(111, polar=True)
bars = ax.bar(theta, radii, width=width, bottom=bottom)



# Use custom colors and opacity
for r, bar in zip(radii, bars):
    bar.set_facecolor(plt.cm.jet(r / 10.))
    bar.set_alpha(0.8)

plt.show()

我不确定圆形条形图代码中是否有任何相关内容,我只是在网上找到它作为圆形设计的参考框架。最终代码将与密度图非常相似,以几乎相同的方式获取数据(当前数据只是虚拟数据,但概念相同)。

我从来没有matplotlibseaborn以前一起工作过,所以不确定我的目标是否可行。另外,我知道圆形密度图可能不是共享数据的最佳或最实用的选择,但在这种情况下,圆形设计更为重要。

标签: pythonmatplotlibseaborn

解决方案


理论上,您可以将轴的投影设置为"polar",然后它将起作用:

x = np.random.vonmises(0, 2, 100)
f, ax = plt.subplots(subplot_kw=dict(projection='polar'))
sns.kdeplot(x)

但这并不是真正的圆形密度,因为要计算您需要使用 von mises 内核,而不是包裹到极坐标的高斯。不幸的是,我认为您需要自己计算圆形密度,然后将其绘制为一条线。


推荐阅读