аргумент pandas.plot c против s

1

У меня есть следующий код из книги машинного обучения в python:

copy_set.plot(kind = "scatter" , x = "longitude" , 
              y = "latitude" , alpha = 0.4 , 
              s = copy_set[ "population" ], 
              label = "population" , figsize=(10,7), 
              c = "median_house_value" , cmap = plt.get_cmap ( "jet" ) ) 

median_house_value и population - это два столбца в copy_set. Я не понимаю, почему для аргумента s я должен использовать copy_set['population'], но для аргумента c можно использовать только имя столбца median_house_value. Когда я пытаюсь использовать имя столбца для параметра s, я получаю сообщение об ошибке:

TypeError: ufunc 'sqrt' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''
  • 0
    Что выводится из copy_set.info() ?
Теги:
pandas
matplotlib

1 ответ

1
Лучший ответ

Очень хороший вопрос. df.plot - это оболочка вокруг нескольких функций построения графика matplotlib. Для kind="scatter" функция scatter matplotlib будет вызвана. Большинство аргументов df.plot() сначала преобразуются в данные в пределах Series вы получаете из столбца dataframe соответствующего имени.

Например

df.plot(x="lon", y="lat")

будут преобразованы в

ax.scatter(x=df["lon"].values, y=df["lat"].values)

Остальные аргументы передаются для разброса, следовательно

df.plot(x="lon", y="lat", some_argument_pandas_doesnt_know=True)

приведет к

ax.scatter(x=df["lon"].values, y=df["lat"].values, some_argument_pandas_doesnt_know=True)

Поэтому, в то время как pandas преобразует th аргументов x, y, c, он не делает этого для s. s, следовательно, просто передается на ax.scatter, но функция matplotlib не знает, что означало бы какую-то строку, например "population".
Для аргументов, передаваемых в функцию matplotlib, необходимо придерживаться подписи matplotlib, а в случае s - напрямую передавать данные.

Обратите внимание, однако, что разброс matplotlib также позволяет использовать строки для своих аргументов. Это, однако, требует сказать, из какого набора данных они должны быть взяты. Это делается с помощью аргумента data. Следовательно, следующее работает отлично и будет matplotlib, эквивалентным вызову панд в вопросе:

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np; np.random.seed(42)

df = pd.DataFrame(np.random.rand(20,2), columns=["lon", "lat"])
df["pop"] = np.random.randint(5,300,size=20)
df["med"] = np.random.rand(20)*1e5

fig, ax = plt.subplots(figsize=(10,7))
sc = ax.scatter(x = "lon", y = "lat", alpha = 0.4, 
                s = "pop", label = "population" , 
                c = "med" , cmap = "jet", data=df)
fig.colorbar(sc, label="med")
ax.set(xlabel="longitude", ylabel="latitude")

plt.show()

Наконец, вы можете теперь спросить, может ли поставка данных в matplotlib через аргумент data одинаково возможным при прохождении через оболочку pandas. К сожалению, нет, потому что pandas использует data как аргумент внутри, так что он не будет передан. Поэтому ваши два варианта:

  1. Используйте pandas, как в вопросе, и предоставите сами данные с помощью аргумента s вместо имени столбца.
  2. Используйте matplotlib, как показано здесь, и используйте имена столбцов для всех аргументов. (Или используйте сами данные, которые вы чаще всего видите при просмотре кода matplotlib.)
  • 0
    Спасибо за исчерпывающий ответ. Теперь один вопрос: как я могу узнать, какие параметры pandas преобразует, а какой - нет?
  • 1
    Я думаю, что плохие новости: вы не можете узнать, не просматривая исходный код. Но в общем случае pandas использует x и y и принимает для них метки. В случае разброса это тоже c .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню