【问题标题】:How can I create a Seaborn line plot with 3 different y-axis?如何创建具有 3 个不同 y 轴的 Seaborn 线图?
【发布时间】:2021-09-24 06:56:57
【问题描述】:

我试图用 3 组不同的数据在 y 轴上绘制 3 个不同的比例。我可以绘制第三条线,但 y2 和 y3 轴是在一起的。

我需要将这两个轴分开,以便它们可读。

这可以通过 Seaborn 库完成吗?

这是代码:

import datetime
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

# Ingest the data
url = 'https://covid.ourworldindata.org/data/owid-covid-data.csv'
covid_data = pd.read_csv(url).set_index("location")

# Clean the data 
df = covid_data.copy()
df.date = pd.to_datetime(df.date)
df = df.loc[df['date'] > (datetime.datetime(2021, 4, 30)), :]
df = df[df.index.isin(['United States'])]

# Select the features of interest
new_cases = 'new_cases_smoothed_per_million'
patients = 'hosp_patients_per_million'
vaccinated = 'people_fully_vaccinated_per_hundred'
bedsT = 'hospital_beds_per_thousand'
bedsM = 'hospital_beds_per_million'
beds_used = 'hospital_beds_used'
df = df.loc[:, ['date', new_cases, patients, vaccinated, bedsT]]
df[bedsM] = df[bedsT] * 1000
df[beds_used]=df.apply(lambda x: x[patients] / x[bedsM], axis = 1)


# Visualise the data
y1_color = "red"
y2_color = "green"
y3_color = "blue"

x1_axis = "date"
y1_axis = new_cases
y2_axis = vaccinated
y3_axis = beds_used

x1 = df[x1_axis]
y1 = df[y1_axis]
y2 = df[y2_axis]
y3 = df[y3_axis]
y2_limit = df[y2_axis].max()


fig, ax1 = plt.subplots(figsize=(16, 6))
ax1.set_title("United States")
ax2 = ax1.twinx()
ax3 = ax1.twinx()

ax2.set(ylim=(0, y2_limit))
g1 = sns.lineplot(data = df, x = x1, y = y1, ax = ax1, color = y1_color) # plots the first set
g2 = sns.lineplot(data = df, x = x1, y = y2, ax = ax2, color = y2_color) # plots the second set 
g3 = sns.lineplot(data = df, x = x1, y = y3, ax = ax3, color = y3_color) # plots the third set 

【问题讨论】:

  • 您应该扩展您的问题以更好地描述您想要实现的目标。你在绘制什么样的数据?你能用seaborn demo data创建一个例子吗?

标签: python matplotlib seaborn visualization


【解决方案1】:

我用你的数据修改了代码,参考了官方示例中的子图。你可以找到参考here

from mpl_toolkits.axes_grid1 import host_subplot
from mpl_toolkits import axisartist

# fig, ax1 = plt.subplots(figsize=(16, 6))
host = host_subplot(111, axes_class=axisartist.Axes) # update
plt.rcParams["figure.figsize"] = (16, 6) # update

ax1.set_title("United States")
# ax1 = host.twinx()
ax2 = host.twinx() # update
ax3 = host.twinx() # update

ax3.axis["right"] = ax3.new_fixed_axis(loc="right", offset=(50, 0)) # update

ax1.axis["right"].toggle(all=True) # update
ax2.axis["right"].toggle(all=True) # update

ax2.set(ylim=(0, y2_limit))
sns.lineplot(data = df, x = x1, y = y1, ax = host, color = y1_color) # plots the first set ax = ax1,
sns.lineplot(data = df, x = x1, y = y2, ax = ax2, color = y2_color) # plots the second set ax = ax2,
sns.lineplot(data = df, x = x1, y = y3, ax = ax3, color = y3_color) # plots the third set ax = ax3, 

plt.show()

【讨论】:

  • 有一部分是导入新模块,一部分是修改绘制图形的代码。如果我的回答对您有帮助,请点击对勾接受它作为正确答案。
猜你喜欢
  • 1970-01-01
  • 2023-03-10
  • 2016-10-22
  • 2018-07-26
  • 1970-01-01
  • 2021-11-07
  • 2019-07-23
  • 2015-09-13
相关资源
最近更新 更多