我目前有以下情节:
问题是,由于短期小提琴图约为-0.1,长期小提琴图约为-0.5,因此图表的可读性远远低于它可能的可读性。因此,我想创建第二个y轴,连接到shortrun小提琴图。
我想使用两个不同的y轴创建一个小提琴图,同时在x轴上为多个标签绘制多个小提琴图。
我在尝试创作一个小提琴的情节。具体来说,对于3个不同的风险组,我想为每个长期和短期弹性绘制一个小提琴图(总共6个小提琴)。由于长期弹性和短期弹性的数量级不同,我想用不同的y尺度来表示长期和短期。
这就是我到目前为止所做的:
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
np.random.seed(50)
# generate some random data
data1 = pd.DataFrame(np.random.normal(loc=0, scale=1, size=1000), columns=['Value'])
data2 = pd.DataFrame(np.random.normal(loc=5, scale=0.1, size=100), columns=['Value'])
data3 = pd.DataFrame(np.random.normal(loc=1, scale=1, size=1000), columns=['Value'])
data4 = pd.DataFrame(np.random.normal(loc=1, scale=0.1, size=100), columns=['Value'])
data5 = pd.DataFrame(np.random.normal(loc=2, scale=1, size=1000), columns=['Value'])
data6 = pd.DataFrame(np.random.normal(loc=2, scale=0.1, size=100), columns=['Value'])
# create the figure and the axes
fig, ax1 = plt.subplots()
# create the first set of violin plots on ax1
sns.violinplot(data=[data1['Value'], data3['Value'], data5['Value']], ax=ax1, palette=['tab:blue', 'tab:orange', 'tab:green'])
# set the label and the color of the left y-axis
ax1.set_ylabel('Data 1', color='tab:blue')
ax1.tick_params(axis='y', labelcolor='tab:blue')
# create the second axes sharing the x-axis with ax1
ax2 = ax1.twinx()
# create the second set of violin plots on ax2
sns.violinplot(data=[data2['Value'], data4['Value'], data6['Value']], ax=ax2, palette=['tab:red', 'tab:purple', 'tab:brown'])
# set the label and the color of the right y-axis
ax2.set_ylabel('Data 2', color='tab:red')
ax2.tick_params(axis='y', labelcolor='tab:red')
# set the x-axis tick locations and labels
ax1.set_xticks([0, 1, 2])
ax1.set_xticklabels(['No Risk', 'Double Risk', 'Expenditure Risk'])
# set the x-axis label and the title
ax1.set_xlabel('Risk Level')
ax1.set_title('Three Sets of Violin Plots with Different Y-Axes')
# adjust the position of the axes
ax2.set_position([0.13, 0.1, 0.775, 0.8])
# show the plot
plt.show()
但是,我希望与每个风险组相对应的两个小提琴图被放置在彼此的旁边,而不是在彼此的顶部。我该怎么弥补。
我以前试过这个,但我不知道如何将它与海运包结合起来:
import matplotlib.pyplot as plt
import numpy as np
# generate some random data
data1 = np.random.normal(loc=0, scale=1, size=1000)
data2 = np.random.normal(loc=0, scale=0.1, size=100)
data3 = np.random.normal(loc=1, scale=1, size=1000)
data4 = np.random.normal(loc=1, scale=0.1, size=100)
# create the figure and the axes
fig, ax1 = plt.subplots()
# create the first set of violin plots on ax1
vp1 = ax1.violinplot([data1, data3], positions=[0, 1], widths=0.5)
vp1['bodies'][0].set_facecolor('tab:blue')
vp1['bodies'][1].set_facecolor('tab:blue')
# set the label and the color of the left y-axis
ax1.set_ylabel('Data 1', color='tab:blue')
ax1.tick_params(axis='y', labelcolor='tab:blue')
# create the second axes sharing the x-axis with ax1
ax2 = ax1.twinx()
# create the second set of violin plots on ax2
vp2 = ax2.violinplot([data2, data4], positions=[0.5, 1.5], widths=0.5)
vp2['bodies'][0].set_facecolor('tab:red')
vp2['bodies'][1].set_facecolor('tab:red')
# set the label and the color of the right y-axis
ax2.set_ylabel('Data 2', color='tab:red')
ax2.tick_params(axis='y', labelcolor='tab:red')
# set the x-axis tick locations and labels
ax1.set_xticks([0.25, 1.25])
ax1.set_xticklabels(['No Risk', 'Double Risk'])
# set the x-axis label and the title
ax1.set_xlabel('Risk Level')
ax1.set_title('Two Sets of Violin Plots with Different Y-Axes')
# adjust the position of the axes
ax2.set_position([0.13, 0.1, 0.775, 0.8])
# show the plot
plt.show()
3条答案
按热度按时间gzszwxb41#
下面是一个如何将数据集分成两个垂直范围(将x轴成对)和自定义小提琴图的示例。您在问题末尾提供的代码片段已经创建了两个垂直范围,因此此响应的目的是提供有关自定义小提琴图以及两个垂直范围的见解。
这可以在没有seaborn包的情况下轻松完成,只需使用matplotlib(参见customizing violin plots)。为了说明,这里有一个小函数,它显示了一些定制,但是matplotlib文档可以进一步扩展这个函数。
完整示例:
该函数还允许您通过指定“side”关键字使用不对称小提琴(参见half violin plot in matplotlib)绘制数据。要将此应用于上面的示例,可以指定left和right并保持位置恒定。
3b6akqbq2#
pd.concat
将所有 Dataframe 组合成具有公共列的单个 Dataframe ,同时使用.assign
添加适当的标识列。seaborn
最适合长格式的 Dataframe 。sns.catplot
与kind='violin'
是axes-levelsns.violinplot
的图形级版本。seaborn
是matplotlib
的高级API。API特别使比较数据组更容易。也就是说,只有这么多的灵活性。对于真正自定义的图,应该直接使用matplotlib
。matplotlib.axes.Axes.violinplot
-显式APImatplotlib.pyplot.violinplot
-隐式API*在
python 3.11.2
、pandas 2.0.0
、matplotlib 3.7.1
、seaborn 0.12.2
中测试导入和数据
选项一:
seaborn
和pandas
df
并绘制到单个y轴,可以轻松比较两组数据,具有相同的比例。df1
和df2
调用plot函数,会导致小提琴的缩放类似于在单独的图中绘制它们。sharey=False
选项二:
matplotlib
和pandas
.groupby
迭代每个组,并在x轴上的特定刻度位置绘制小提琴。使用单个 Dataframe
df
使用 Dataframe
df1
和df2
,每个时间段和twinx
df
视图ahy6op9u3#
其他的答案都很复杂。我认为使用
seaborn.violinplot
实现这一点的一个更简单的方法是调用violinplot
两次,但使用hue
和hue_order
来获得dodged效果: