从 pandas dataFrame 调整 seaborn 图

Posted

技术标签:

【中文标题】从 pandas dataFrame 调整 seaborn 图【英文标题】:Tweaking the seaborn graph from pandas dataFrame 【发布时间】:2016-11-03 07:38:57 【问题描述】:

我正在尝试绘制来自欧洲 11 个城市的互联网流量的时间序列图。

我从internet traffic data of 11 european cities获得了数据集的访问权限

# !/usr/bin/env python3.4
# -*- coding: utf-8 -*-

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

df = pd.read_csv('internet-traffic-data-in-bits.csv')

print(df.dtypes)


bp = sns.tsplot([df.Internet_traffic_data_in_bits],color="indianred",)

bp.set(xlabel='Date', ylabel='Internet Traffic Data (bits) in 11 European cities')

plt.xticks(rotation=45)
# plt.tight_layout()
plt.show()

我得到的图表显示在这里。

我的问题主要是关于调整或美化下图。

1) 我希望在 x 轴上更频繁地标记 date。 2) 我希望 Y 轴的数字对于每个值都有 0.6x10^12(或类似的值),而不是最顶部的 1e12。 3) 我在几个场合调用matplotlib.pyplot 对象。我想避开它,直接处理seaborn对象

如果有人可以帮助我,那就太好了。

【问题讨论】:

【参考方案1】:

以下是我将如何以两种不同的方式执行此操作,具体取决于您希望如何格式化 y-ticks。

我没有你的数据集,所以我自己创建了一个。

进口:

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
# Ticker module
import matplotlib.ticker as mtick

第一种方法的代码:

#df = pd.read_csv('internet-traffic-data-in-bits.csv')
bp = sns.tsplot([df.traffic],color="indianred",)
bp.set(xlabel='Date', ylabel='Internet Traffic Data (bits) in 11 European cities')
loc = mtick.MultipleLocator(base=5.0) # This locator puts ticks at regular intervals
bp.xaxis.set_major_locator(loc) # Apply the locator to the x-axis

# First approach: Format each tick in the "1.52e12" format.
bp.yaxis.set_major_formatter(mtick.FormatStrFormatter('%.2e')) # Format each y-tick in scientific format.
plt.tight_layout()
plt.show()

结果图:

第二种方法的代码:

#df = pd.read_csv('internet-traffic-data-in-bits.csv')
bp = sns.tsplot([df.traffic],color="indianred",)
bp.set(xlabel='Date', ylabel='Internet Traffic Data (bits) in 11 European cities')
loc = mtick.MultipleLocator(base=5.0) # This locator puts ticks at regular intervals
bp.xaxis.set_major_locator(loc) # Apply the locator to the x-axis

# Second approach: Fancier formatting using a function.
def as_si(x, *args):
    """
    Format a number in a custom scientific notation, using a fixed number of decimal places.
    """
    ndp = 2 # Number of decimal places
    s = 'x:0.ndp:de'.format(x=x, ndp=ndp) # Format the string: 1520 becomes 1.52e3
    m, e = s.split('e') # Split the string around the letter e
    return 'm:sx10^e:d'.format(m=m, e=int(e)) # Return a formatted string with exponent.

bp.yaxis.set_major_formatter(mtick.FuncFormatter(as_si)) # Format each y-tick in the custom format.
plt.tight_layout()
plt.show()

结果图:

【讨论】:

以上是关于从 pandas dataFrame 调整 seaborn 图的主要内容,如果未能解决你的问题,请参考以下文章

《Pandas CookBook》---- DataFrame基础操作

使用 List Comprehension (Pandas) 从 DataFrames 列表中删除 DataFrames 列

pandas的DataFrame对象抽取“整列”或者“整行”数据

从 Pandas Dataframe 错误创建 Spark DataFrame

pandas从dataframe中删除一个或多个数据列

从 pandas DataFrame 制作热图